RestSharp AddFile 添加多部分形式 headers 到文件
RestSharp AddFile adding multipart form headers to file
我正在使用 RestSharp 的 AddFile,它工作得很好,除了我的文件由于添加的 header 信息而最终损坏。
-------------------------------28947758029299
Content-Disposition: form-data; name="user.png"; filename="user.png"
Content-Type: image/png
这只是我上传的一张测试图片。如果我从文件中删除这些行,那么它可以正常打开,否则它似乎已损坏。
我可以在不添加这些东西的情况下使用 AddFile 吗?
当前代码:
string contentType = MimeMapping.GetMimeMapping("~/uploads/" + filename); //image/png etc
request.AddFile(filename, Server.MapPath("~") + "\uploads\" + filename, contentType);
IRestResponse response = client.Execute(request);
也试过同样的结果:
request.AddHeader("Content-Type", contentType);
byte[] bytes = File.ReadAllBytes(Server.MapPath("~") + "\uploads\" + filename);
request.AddBody(new {myFile = File.ReadAllBytes(Server.MapPath("~") + "\uploads\" + filename) });
还有这个(这里根本没有文件经过):编辑:这确实有效
string contentType = MimeMapping.GetMimeMapping("~/uploads/" + filename);
byte[] bytes = File.ReadAllBytes(Server.MapPath("~") + "\uploads\" + filename);
request.AddHeader("Content-Type", contentType);
request.AddParameter(contentType, bytes, ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
RestSharp 默认情况下使用 multi-part 表单数据发送文件,而您正在使用的 zendesk api(假设是这个 https://developer.zendesk.com/rest_api/docs/core/attachments#upload-files)不期望这样,所以它还将内容中的 multi-part 边界标识符写入上传的文件。
这个其他线程上的答案 https://whosebug.com/a/27994251/772973 应该可以解决您的问题。
更新
我只是将控制台应用程序与以下代码放在一起,以将 pdf 上传到我创建的 ASP.NET WebApi 项目,因为我无法访问 ZenDesk API
主要在program.cs:
static void Main(string[] args)
{
RestRequest request = new RestRequest("values?fileName=test.pdf", Method.POST);
request.AddParameter("application /pdf", File.ReadAllBytes(@"C:\Temp\upload.pdf"), ParameterType.RequestBody);
var client = new RestClient(new Uri("http://localhost:55108/api"));
var response = client.Execute(request);
Console.ReadLine();
}
ValuesController.cs
中的代码
public async Task Post(string fileName)
{ static void Main(string[] args)
{
RestRequest request = new RestRequest("values?fileName=test.pdf", Method.POST);
request.AddParameter("application/pdf", File.ReadAllBytes(@"C:\Temp\upload.pdf"), ParameterType.RequestBody);
var client = new RestClient(new Uri("http://localhost:55108/api"));
var response = client.Execute(request);
Console.ReadLine();
}
var file = await this.Request.Content.ReadAsByteArrayAsync();
File.WriteAllBytes($"C:\Uploaded\{fileName}",file);
}
此上传文件,与原始文件相同,content-type header 设置为 application/pdf
而不是 multipart/form-data; boundary=-----------------------------28947758029299
更新 2
在 program.cs
中添加了 Main 的实际代码
我正在使用 RestSharp 的 AddFile,它工作得很好,除了我的文件由于添加的 header 信息而最终损坏。
-------------------------------28947758029299
Content-Disposition: form-data; name="user.png"; filename="user.png"
Content-Type: image/png
这只是我上传的一张测试图片。如果我从文件中删除这些行,那么它可以正常打开,否则它似乎已损坏。 我可以在不添加这些东西的情况下使用 AddFile 吗?
当前代码:
string contentType = MimeMapping.GetMimeMapping("~/uploads/" + filename); //image/png etc
request.AddFile(filename, Server.MapPath("~") + "\uploads\" + filename, contentType);
IRestResponse response = client.Execute(request);
也试过同样的结果:
request.AddHeader("Content-Type", contentType);
byte[] bytes = File.ReadAllBytes(Server.MapPath("~") + "\uploads\" + filename);
request.AddBody(new {myFile = File.ReadAllBytes(Server.MapPath("~") + "\uploads\" + filename) });
还有这个(这里根本没有文件经过):编辑:这确实有效
string contentType = MimeMapping.GetMimeMapping("~/uploads/" + filename);
byte[] bytes = File.ReadAllBytes(Server.MapPath("~") + "\uploads\" + filename);
request.AddHeader("Content-Type", contentType);
request.AddParameter(contentType, bytes, ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
RestSharp 默认情况下使用 multi-part 表单数据发送文件,而您正在使用的 zendesk api(假设是这个 https://developer.zendesk.com/rest_api/docs/core/attachments#upload-files)不期望这样,所以它还将内容中的 multi-part 边界标识符写入上传的文件。
这个其他线程上的答案 https://whosebug.com/a/27994251/772973 应该可以解决您的问题。
更新
我只是将控制台应用程序与以下代码放在一起,以将 pdf 上传到我创建的 ASP.NET WebApi 项目,因为我无法访问 ZenDesk API
主要在program.cs:
static void Main(string[] args)
{
RestRequest request = new RestRequest("values?fileName=test.pdf", Method.POST);
request.AddParameter("application /pdf", File.ReadAllBytes(@"C:\Temp\upload.pdf"), ParameterType.RequestBody);
var client = new RestClient(new Uri("http://localhost:55108/api"));
var response = client.Execute(request);
Console.ReadLine();
}
ValuesController.cs
中的代码public async Task Post(string fileName)
{ static void Main(string[] args)
{
RestRequest request = new RestRequest("values?fileName=test.pdf", Method.POST);
request.AddParameter("application/pdf", File.ReadAllBytes(@"C:\Temp\upload.pdf"), ParameterType.RequestBody);
var client = new RestClient(new Uri("http://localhost:55108/api"));
var response = client.Execute(request);
Console.ReadLine();
}
var file = await this.Request.Content.ReadAsByteArrayAsync();
File.WriteAllBytes($"C:\Uploaded\{fileName}",file);
}
此上传文件,与原始文件相同,content-type header 设置为 application/pdf
而不是 multipart/form-data; boundary=-----------------------------28947758029299
更新 2
在 program.cs
中添加了 Main 的实际代码