RestSharp AddFile将多部分表头添加到文件中

时间:2017-07-28 17:47:05

标签: c# rest restsharp

我正在使用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) });

此外(此处没有文件通过):编辑:这实际上有效

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);

1 个答案:

答案 0 :(得分:2)

默认情况下,RestSharp使用多部分表单数据和您正在使用的zendesk api发送文件(假设它是https://developer.zendesk.com/rest_api/docs/core/attachments#upload-files)并不期望这样,所以它也是将多部分边界标识符从内容写入上传文件。

此另一个帖子的答案https://stackoverflow.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);
}

这上传了文件,它与原始文件相同,内容类型标题设置为application/pdf而不是multipart/form-data; boundary=-----------------------------28947758029299

更新2

在program.cs中添加了Main的实际代码