【问题标题】:RestSharp AddFile adding multipart form headers to fileRestSharp AddFile 将多部分表单标题添加到文件
【发布时间】:2017-07-28 17:47:05
【问题描述】:

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

【问题讨论】:

  • 如果有人对我上传的内容感到好奇,请使用 zendesk api

标签: c# rest restsharp


【解决方案1】:

默认情况下,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 的实际代码

【讨论】:

  • 这似乎与我上面的第二个示例非常相似。我用您在上面的第三个示例中发布的内容进行了尝试,但是当我使用 AddParameter 时,文件上传根本没有通过
  • 让它与我在上面发布的最后一件事一起工作。有一些其他的代码把它搞砸了。所以你第一次帮我就够了。谢谢!
  • 好消息。不确定我在 program.cs 中的 main 示例代码发生了什么,因此编辑了答案并添加了它,以防将来有人需要该示例
  • 我知道这是很久以前的回答,但也许你们可以帮忙;您如何对 >2gb 的文件执行相同操作,File.ReadAllBytes 将引发异常。我尝试使用request.AddFile,但我不知道如何制作Action<Stream>。任何帮助将不胜感激
  • @EmmanuelF 我已经有一段时间没看这个了,我也没有在我的电脑前确认一下,但是你可以使用 ()=> File.OpenRead(@“c:\Temp\upload.pdf”) 作为 Action 参数,因为它返回一个 FileStream
猜你喜欢
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 2020-11-27
  • 2014-01-14
  • 1970-01-01
  • 2021-08-25
相关资源
最近更新 更多