通过 Rest api 上传到 Azure devops 的附件未打开
Attachment uploaded to Azure devops through Rest api is not opening
您好,我已关注 Microsoft 文档并上传了附件 devops 并成功将其附加到工作项。但是当我从 devops userinteface 文件下载文件时显示但无法打开它。
这是代码
正在将 Iformfile 对象转换为二进制文件 提前致谢:)
foreach (var item in enterddetals.Attachments)
{
TicketAttachemnts attachemnt = new TicketAttachemnts();
attachemnt.TicketNo = enterddetals.TicketNo;
attachemnt.Name = Path.GetFileName(item.FileName);
attachemnt.FileType = Path.GetExtension(item.FileName);
using (var target = new MemoryStream())
{
item.CopyTo(target);
attachemnt.FileContent = target.ToArray();
}
string attachjson = JsonConvert.SerializeObject(attachemnt);
response = await _azuredevopsmnger.CreateAttachement("DevOps/CreateAttachement",attachjson);
正在创建附件并将其链接到工作项
ResultClass res = new ResultClass();
var personalaccesstoken = "";
string baseUrl = "https://.../_apis/wit/attachments?fileName={0}&api-version=5.0";
string baseUrl2 = "https:/.../_apis/wit/workitems/{0}?api-version=5.0";
string url= string.Format(baseUrl, attachments.Name);
string url2= string.Format(baseUrl2, attachments.TicketNo);
string msg1 = "Ticket created successfully!! Your Ticket ID is :{0}";
string msg2 = "Ohh....Ticket creation Failed !! Reson: {0}";
var json = new StringContent(JsonConvert.SerializeObject(attachments.FileContent), Encoding.UTF8, "application/json-patch+json");
try
{
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Add(
new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "", personalaccesstoken))));
using (HttpResponseMessage response = client.PostAsync(url,json).Result)
{
response.EnsureSuccessStatusCode();
string responseBody = response.Content.ReadAsStringAsync().Result;
JObject data = JObject.Parse(responseBody);
string result = Convert.ToString(data["url"]);
List<Root> atc = new List<Root>();
Root att = new Root();
Attributes at = new Attributes();
Value v = new Value();
at.comment = "Spec for the work";
v.rel = "AttachedFile";
v.url = result;
v.attributes = at;
att.op = "add";
att.path = "/relations/-";
att.value = v;
atc.Add(att);
json = new StringContent(JsonConvert.SerializeObject(atc), Encoding.UTF8, "application/json-patch+json");
// return responseBody;
}
using (HttpResponseMessage response = client.PatchAsync(url2, json).Result)
{
response.EnsureSuccessStatusCode();
string responseBody = response.Content.ReadAsStringAsync().Result;
JObject data = JObject.Parse(responseBody);
int result = Convert.ToInt32(data["id"]);
res.IsSuccess = true;
res.ticketID = result;
res.message = string.Format(msg1, result);
return res;
}
[file stored in devops ][1]
[Error Msg when downloaded and opened it][1]
问题出在您创建附件时传递给 client.PostAsync
方法的 json 主体。
您应该将文件读取为字节并构建 ByteArrayContent
而不是 StringContent
。
我不知道上面 item
你的实例。但是当你创建附件时。首先,您需要将文件读取为字节数组。例如:
var bitArr = File.ReadAllBytes(@"C:\Test\UploadTemp\pic.png");
然后转换为ByteArrayContent
。例如
var json = new ByteArrayContent(bitArr);
HttpResponseMessage response = client.PostAsync(url, json).Result;
请看下面的例子:
public string uploadAttachment() {
#read the files as byteArray
var bitArr = File.ReadAllBytes(@"C:\Test\UploadTemp\pic.png");
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Add(
new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "", personalaccesstoken))));
var json = new ByteArrayContent(bitArr); ##convert to ByteArrayContent
json.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
HttpResponseMessage response = client.PostAsync(url, json).Result;
string responseBody = response.Content.ReadAsStringAsync().Result;
JObject data = JObject.Parse(responseBody);
string result = Convert.ToString(data["url"]);
return result;
}
}
我使用上面的代码创建了附件。并且从UI.
下载附件可以成功打开
您好,我已关注 Microsoft 文档并上传了附件 devops 并成功将其附加到工作项。但是当我从 devops userinteface 文件下载文件时显示但无法打开它。 这是代码
正在将 Iformfile 对象转换为二进制文件 提前致谢:)
foreach (var item in enterddetals.Attachments)
{
TicketAttachemnts attachemnt = new TicketAttachemnts();
attachemnt.TicketNo = enterddetals.TicketNo;
attachemnt.Name = Path.GetFileName(item.FileName);
attachemnt.FileType = Path.GetExtension(item.FileName);
using (var target = new MemoryStream())
{
item.CopyTo(target);
attachemnt.FileContent = target.ToArray();
}
string attachjson = JsonConvert.SerializeObject(attachemnt);
response = await _azuredevopsmnger.CreateAttachement("DevOps/CreateAttachement",attachjson);
正在创建附件并将其链接到工作项
ResultClass res = new ResultClass();
var personalaccesstoken = "";
string baseUrl = "https://.../_apis/wit/attachments?fileName={0}&api-version=5.0";
string baseUrl2 = "https:/.../_apis/wit/workitems/{0}?api-version=5.0";
string url= string.Format(baseUrl, attachments.Name);
string url2= string.Format(baseUrl2, attachments.TicketNo);
string msg1 = "Ticket created successfully!! Your Ticket ID is :{0}";
string msg2 = "Ohh....Ticket creation Failed !! Reson: {0}";
var json = new StringContent(JsonConvert.SerializeObject(attachments.FileContent), Encoding.UTF8, "application/json-patch+json");
try
{
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Add(
new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "", personalaccesstoken))));
using (HttpResponseMessage response = client.PostAsync(url,json).Result)
{
response.EnsureSuccessStatusCode();
string responseBody = response.Content.ReadAsStringAsync().Result;
JObject data = JObject.Parse(responseBody);
string result = Convert.ToString(data["url"]);
List<Root> atc = new List<Root>();
Root att = new Root();
Attributes at = new Attributes();
Value v = new Value();
at.comment = "Spec for the work";
v.rel = "AttachedFile";
v.url = result;
v.attributes = at;
att.op = "add";
att.path = "/relations/-";
att.value = v;
atc.Add(att);
json = new StringContent(JsonConvert.SerializeObject(atc), Encoding.UTF8, "application/json-patch+json");
// return responseBody;
}
using (HttpResponseMessage response = client.PatchAsync(url2, json).Result)
{
response.EnsureSuccessStatusCode();
string responseBody = response.Content.ReadAsStringAsync().Result;
JObject data = JObject.Parse(responseBody);
int result = Convert.ToInt32(data["id"]);
res.IsSuccess = true;
res.ticketID = result;
res.message = string.Format(msg1, result);
return res;
}
[file stored in devops ][1]
[Error Msg when downloaded and opened it][1]
问题出在您创建附件时传递给 client.PostAsync
方法的 json 主体。
您应该将文件读取为字节并构建 ByteArrayContent
而不是 StringContent
。
我不知道上面 item
你的实例。但是当你创建附件时。首先,您需要将文件读取为字节数组。例如:
var bitArr = File.ReadAllBytes(@"C:\Test\UploadTemp\pic.png");
然后转换为ByteArrayContent
。例如
var json = new ByteArrayContent(bitArr);
HttpResponseMessage response = client.PostAsync(url, json).Result;
请看下面的例子:
public string uploadAttachment() {
#read the files as byteArray
var bitArr = File.ReadAllBytes(@"C:\Test\UploadTemp\pic.png");
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Add(
new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "", personalaccesstoken))));
var json = new ByteArrayContent(bitArr); ##convert to ByteArrayContent
json.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
HttpResponseMessage response = client.PostAsync(url, json).Result;
string responseBody = response.Content.ReadAsStringAsync().Result;
JObject data = JObject.Parse(responseBody);
string result = Convert.ToString(data["url"]);
return result;
}
}
我使用上面的代码创建了附件。并且从UI.
下载附件可以成功打开