HttpClient:如何一次上传多个文件

Posted

技术标签:

【中文标题】HttpClient:如何一次上传多个文件【英文标题】:HttpClient: How to upload multiple files at once 【发布时间】:2013-06-03 22:13:13 【问题描述】:

我正在尝试使用System.Net.Http.HttpClient 上传多个文件。

using (var content = new MultipartFormDataContent())

   content.Add(new StreamContent(imageStream), "image", "image.jpg");
   content.Add(new StreamContent(signatureStream), "signature", "image.jpg.sig");

   var response = await httpClient.PostAsync(_profileImageUploadUri, content);
   response.EnsureSuccessStatusCode();

这只会发送多部分/表单数据,但我希望多部分/混合在帖子的某个地方。

更新:好的,我知道了。

using (var content = new MultipartFormDataContent())

    var mixed = new MultipartContent("mixed")
    
        CreateFileContent(imageStream, "image.jpg", "image/jpeg"),
        CreateFileContent(signatureStream, "image.jpg.sig", "application/octet-stream")
    ;

    content.Add(mixed, "files");

    var response = await httpClient.PostAsync(_profileImageUploadUri, content);
    response.EnsureSuccessStatusCode();


private StreamContent CreateFileContent(Stream stream, string fileName, string contentType)

    var fileContent = new StreamContent(stream);
    fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("file") FileName = fileName;
    fileContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);
    return fileContent;

这在钢丝鲨上看起来是正确的。但我看不到控制器中的文件。

[HttpPost]
public ActionResult UploadProfileImage(IEnumerable<HttpPostedFileBase> postedFiles)

    if(postedFiles == null)
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

    // more code here

postedFiles 仍然为空。有什么想法吗?

【问题讨论】:

可悲的是,我也遇到了这个问题:***.com/questions/15638622/… 【参考方案1】:

成功了。但是行为很奇怪。

using (var content = new MultipartFormDataContent())

    content.Add(CreateFileContent(imageStream, "image.jpg", "image/jpeg"));
    content.Add(CreateFileContent(signatureStream, "image.jpg.sig", "application/octet-stream"));

    var response = await httpClient.PostAsync(_profileImageUploadUri, content);
    response.EnsureSuccessStatusCode();


private StreamContent CreateFileContent(Stream stream, string fileName, string contentType)

    var fileContent = new StreamContent(stream);
    fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") 
     
        Name = "\"files\"", 
        FileName = "\"" + fileName + "\""
    ; // the extra quotes are key here
    fileContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);            
    return fileContent;


[HttpPost]
public ActionResult UploadProfileImage(IList<HttpPostedFileBase> files)

    if(files == null || files.Count != 2)
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

    // more code

【讨论】:

哇,你真是个天才。完美运行! @KirkWoll 谢谢。实际上,我最近在使用 Xamarin 时遇到了一个问题,因为在添加额外引号时它会失败。所以我不得不编写自己的 MultipartFormDataContent 类 @esskar 服务器端代码是什么样的?我无法让它工作。 为了将来的参考,如果有人不能让它在其他后端服务器(如 Laravel 或 Express)中工作,只需将数组 [] 添加到 Name = "\"files\"'' => Name = "\"files[]\"'' 我卡住了这个问题花了几个小时才得到解决。 whats Stream stream FileStream,MemoryStream,什么?

以上是关于HttpClient:如何一次上传多个文件的主要内容,如果未能解决你的问题,请参考以下文章

C#:HttpClient,将多个文件作为MultipartFormDataContent上传时的文件上传进度

如何使用 Apache HttpClient 4 获取文件上传的进度条?

网络条件差时如何处理文件HttpClient.PostAsync文件上传?

如何使用 HTTP POST 使用 HTML 和 PHP 选择和上传多个文件?

httpclient如何一起上传内容和图片

java模拟http请求上传文件,基于Apache的httpclient