Work item attachments
TFS 2017 | TFS 2015 | TFS 2013
Note
Looking for REST APIS that support TFS 2018 or later versions? See the Azure DevOps REST API Reference.
api-version = 1.0
If you haven't already, look at the information on getting started with these APIs.
Upload an attachment
To attach a file to a work item, upload the attachment to the attachment store, then attach it to the work item.
Note
For Team Services, you can add up to 100 attachments to a work item. Attempts to add more result in an error message upon saving the work item.
POST https://{instance}/DefaultCollection/_apis/wit/attachments?api-version={version}&filename={string}
Content-Type: application/octet-stream
{ file-contents }
Parameter | Type | Notes |
---|---|---|
URL | ||
instance | string | TFS server name ({server:port}). |
Query | ||
api-version | string | Version of the API to use. |
filename | string | The name of the file in the attachment store (typically the same as the name of the source of the attachment). |
uploadType | enum{simple, chunked} | Default is simple. Use chunked upload type for uploading large files (>130 MB). |
Body | ||
file-contents | string | The contents of the file. |
A text file
Sample request
POST https://mytfsserver/DefaultCollection/_apis/wit/attachments?fileName=textAsFileAttachment.txt&api-version=1.0
"User text content to upload"
Sample response
{
"id": "6b2266bf-a155-4582-a475-ca4da68193ef",
"url": "https://mytfsserver/DefaultCollection/_apis/wit/attachments/6b2266bf-a155-4582-a475-ca4da68193ef?fileName=textAsFileAttachment.txt"
}
Sample code
View sample for a full example on uploading an attachment to a work item.
function UploadAttachment() {
var files = document.getElementById('fileselect').files;
if (!files.length) {
alert('Please select a file!');
return;
}
var file = files[0];
var filename = file.name;
var reader = new FileReader();
reader.onloadend = function (evt) {
if (evt.target.readyState == FileReader.DONE) {
// Post file content to server
$.ajax({
url: "http://fabrikam.visualstudio.com/DefaultCollection/_apis/wit/attachments?filename=" + filename + "&api-version=1.0",
data: evt.target.result,
processData: false,
contentType: "application/octet-stream",
type: "POST"
});
}
};
reader.readAsArrayBuffer(file);
}
Chunked upload
On accounts with higher attachment upload limits (>130MB), you will need to used "chunked" upload to upload your file. First, register your chunked upload by doing the following:
POST https://{account}.VisualStudio.com/DefaultCollection/_apis/wit/attachments?uploadType=chunked&fileName={filename}&api-version={version}
Sample request
POST https://mytfsserver/DefaultCollection/_apis/wit/attachments?uploadType=chunked&fileName=largefile.zip&api-version=2.0
Sample response
{
"id": "de471719-27b2-40ab-ac40-4890f3eb1443",
"url": "https://mytfsserver/DefaultCollection/_apis/wit/attachments/de471719-27b2-40ab-ac40-4890f3eb1443?fileName=test.txt"
}
Next, upload your content to the attachment endpoint returned in the previous request via PUT.
PUT https://{account}.VisualStudio.com/DefaultCollection/_apis/wit/attachments/{attachmentid}?uploadType=chunked&api-version={version}
Specify the byte range of the chunk using Content-Length. For example: "Content-Length": "bytes 0-39999/50000" for the first 40000 bytes of a 50000 byte file.
Sample request
POST https://mytfsserver/DefaultCollection/_apis/wit/attachments/de471719-27b2-40ab-ac40-4890f3eb1443?uploadType=chunked&api-version=2.0
"{zip content chunk 1}"
Sample response
{
"id": "de471719-27b2-40ab-ac40-4890f3eb1443",
"url": "https://mytfsserver/DefaultCollection/_apis/wit/attachments/de471719-27b2-40ab-ac40-4890f3eb1443"
}
Sample request
PUT https://mytfsserver/DefaultCollection/_apis/wit/attachments/de471719-27b2-40ab-ac40-4890f3eb1443?uploadType=chunked&api-version=2.0
"{zip content chunk 2}"
Sample response
{
"id": "de471719-27b2-40ab-ac40-4890f3eb1443",
"url": "https://mytfsserver/DefaultCollection/_apis/wit/attachments/de471719-27b2-40ab-ac40-4890f3eb1443"
}
Download an attachment
GET https://{instance}/DefaultCollection/_apis/wit/attachments/{attachment}?api-version={version}
Parameter | Type | Notes |
---|---|---|
URL | ||
instance | string | TFS server name ({server:port}). |
attachment | GUID | ID of the attachment to download. |
Query | ||
api-version | string | Version of the API to use. |
Sample request
GET https://fabrikam-fiber-inc:8080/DefaultCollection/_apis/wit/attachments/fbb31ee5-740d-4254-9453-07c1bd189ead?api-version=1.0
Response
Status code: 200
{ file-contents }