C# 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 这只是我上传的一张测试图片。如果我从文件中删除这些行,那么它将正常打开,否则它似乎已损坏。 我可以在不添加这些内容的

我使用的是RestSharp的AddFile,它工作得很好,只是我的文件由于添加了这个头信息而被破坏了

-------------------------------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”)
作为操作参数,因为它返回一个文件流