C# RestSharp AddFile向文件添加多部分表单头
我使用的是RestSharp的AddFile,它工作得很好,只是我的文件由于添加了这个头信息而被破坏了C# RestSharp AddFile向文件添加多部分表单头,c#,rest,restsharp,C#,Rest,Restsharp,我使用的是RestSharp的AddFile,它工作得很好,只是我的文件由于添加了这个头信息而被破坏了 -------------------------------28947758029299 Content-Disposition: form-data; name="user.png"; filename="user.png" Content-Type: image/png 这只是我上传的一张测试图片。如果我从文件中删除这些行,那么它将正常打开,否则它似乎已损坏。 我可以在不添加这些内容的
-------------------------------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) });
还有这个(这里根本没有文件通过):Edit:这实际上起作用了
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使用多部分表单数据发送文件,而您使用的zendesk api(假设是此api)并不期望这样,因此它还将内容中的多部分边界标识符写入上传的文件 在另一个线程上的这个答案应该可以解决您的问题 更新 我只是把一个控制台应用程序和下面的代码放在一起,将pdf上传到我创建的ASP.NET WebApi项目中,因为我没有访问ZenDesk API的权限 program.cs中的Main:
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();
}
值controller.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);
}
这上传了文件,与原始文件相同,内容类型标题设置为application/pdf
,而不是multipart/form data;边界=------------------------------------28947758029299
更新2
如果有人对我上传的内容感兴趣,可以使用zendesk api在program.cs中添加Main的实际代码,这与上面的第二个示例非常相似。我在上面的第三个示例中尝试了你发布的内容,但是当我使用AddParameter时,文件上传根本没有通过。我在上面发布的最后一个内容中使用了AddParameter。有一些其他的代码把事情搞砸了。第一次你帮了我很多。谢谢好消息。不确定我在program.cs中的main示例代码发生了什么,所以编辑了答案并添加了它,以防将来有人需要该示例。我知道这是很久以前的答案,但也许你们可以帮助;如何对大于2gb的文件执行相同操作,
文件.ReadAllBytes
将引发异常。我尝试使用request.AddFile
,但我不知道如何执行操作。任何帮助都可能是错误的appreciated@EmmanuelF我已经有很长一段时间没有看这个了,我也不在电脑前确认,但您可以使用()=>File.OpenRead(@“c:\Temp\upload.pdf”)
作为操作参数,因为它返回一个文件流