代码之家  ›  专栏  ›  技术社区  ›  BadShift

tfs 2017使用REST API向workitem附件添加png

  •  0
  • BadShift  · 技术社区  · 6 年前

    我正在尝试为TFS 2017中的工作项创建附件。我在tfs REST API中找到了“createAttachment”方法。

    https://www.visualstudio.com/en-us/docs/integrate/extensions/reference/client/api/tfs/workitemtracking/restclient/workitemtrackinghttpclient2_2#method_createAttachment

    我能够使这种方法适用于文本文件。但我需要做的是创建一个图像附件。我可以访问文件的byteArray内容和文件的base64内容。但当我尝试传递byteArray时,我得到了以下错误:“405方法不允许”。 如果我传递了图像的base64内容,则会创建附件,但图像无效。

    以下是我使用的代码:

    images_upload_handler: function (blobInfo, success, failure) 
       {
       var client = _RestClient.getClient();            
       var byteString = atob(blobInfo.base64());
    
       client.createAttachment(byteString).then(function (item)
          {
          console.log(item.url);
          });
       }
    

    我需要找到一种方法,从javascript自定义控件扩展内部为tfs工作项创建png附件。

    谢谢

    2 回复  |  直到 6 年前
        1
  •  0
  •   Andy Li-MSFT    6 年前

    通常,您需要将图像上载到 无base64编码的二进制格式 .

    正如消息所说的那样” 405 Method Not Allowed “”中,无法创建png图像。

    但是,您可以尝试将png附件上载到附件存储,然后将其附加到工作项。

    1. Upload an attachment 和示例代码: C# (UploadBinaryFile method) . ( 请注意,您需要上载 无base64编码的二进制图像。 )
    2. Add an attachment 和示例代码: C# (AddAttachment method)

    这篇文章也可能有助于: Insert an inline image into a Work Item with the TFS API


    更新:

    我们无法创建png文件,我们只能上载现有png文件并将其附加到工作项。

    enter image description here

        2
  •  0
  •   BadShift    6 年前

    通过将Post请求的processData参数设置为false,我可以使其正常工作。请参见以下代码:

    var byteString = atob(blobInfo.base64());
    var ab = new ArrayBuffer(byteString.length);
    var ia = new Uint8Array(ab);
    for (var i = 0; i < byteString.length; i++) 
       {
       ia[i] = byteString.charCodeAt(i);
       }
    
    $.ajax(
      {
         type: "POST",
         contentType: "application/octet-stream",
         url: SERVER_URI + "_apis/wit/attachments?filename=" + blobInfo.filename() + "&api-version=1.0",
         data: ia,
         processData: false,
         headers:
            {
            'Authorization': 'Basic ' + btoa(":" + TOKEN)
            }
      }).always(function (data)
      {
         console.log(data.url);
      });