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

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

这只发送mulipart / form-data,但我预计会在post中的某个地方使用multipart / mixed。

更新:好的,我到了。

 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 postedFiles) { if(postedFiles == null) return new HttpStatusCodeResult(HttpStatusCode.BadRequest); // more code here } 

postedFiles仍然为null。 有任何想法吗?

搞定了。 但行为很奇怪。

 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 files) { if(files == null || files.Count != 2) return new HttpStatusCodeResult(HttpStatusCode.BadRequest); // more code }