自定义表单数据与多个文件到Web API控制器

我在获取我在API控制器中指定的所有表单数据时遇到问题。

javascript上传function:

$scope.upload[index] = $upload.upload({ url: '/api/upload/', method: 'POST', data: { Photographer: $scope.models[index].photographer, Description: $scope.models[index].desc }, file: $scope.models[index].file }) 

表单数据:按照我的意愿工作,对于发送的每个请求,它包含我想要的值。

 ------WebKitFormBoundaryzlLjAnm449nw1EvC Content-Disposition: form-data; name="Photographer" Scott Johnson ------WebKitFormBoundaryzlLjAnm449nw1EvC Content-Disposition: form-data; name="Description" Image taken with a Nikon camerea ------WebKitFormBoundaryzlLjAnm449nw1EvC Content-Disposition: form-data; name="file"; filename="moxnes.jpg" Content-Type: image/jpeg 

我的Web API控制器:

本指南中的模板

 public class UploadController : ApiController { public async Task  PostFormData() { var root = HttpContext.Current.Server.MapPath("~/App_Data"); var provider = new MultipartFormDataStreamProvider(root); try { // Read the form data. await Request.Content.ReadAsMultipartAsync(provider); // Show all the key-value pairs. foreach(var key in provider.FormData.AllKeys) { foreach(var val in provider.FormData.GetValues(key)) { var keyValue = string.Format("{0}: {1}", key, val); } } foreach(MultipartFileData fileData in provider.FileData) { var fileName = fileData.Headers.ContentDisposition.FileName; } return Request.CreateResponse(HttpStatusCode.OK); } catch (Exception e) { return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e); } } } 

这是问题:控制器可以异步接收多个请求并通过此循环读取所有文件: foreach(MultipartFileData fileData in provider.FileData)工作正常,但我的其他表单数据值(Phtographer和Description)仅包含一个值请求(收到的最后一个请求)。

 foreach(var key in provider.FormData.AllKeys) 

我需要从每个请求表中取出数据值。 我怎么能这样做,还是有更好的方法来解决这个问题? 也许通过添加模型作为参数?

我和它一起使用了它,它对我来说很好用:

 public partial class UploadController : ApiController { [HttpPost] public Task PostFormData() { // Check if the request contains multipart/form-data. if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } string root = HttpContext.Current.Server.MapPath("~/App_Data"); var provider = new MultipartFormDataStreamProvider(root); // Read the form data and return an async task. var task = Request.Content.ReadAsMultipartAsync(provider). ContinueWith(t => { if (t.IsFaulted || t.IsCanceled) { Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception); } foreach (MultipartFileData file in provider.FileData) { using (StreamReader fileStream = new StreamReader(file.LocalFileName)){ if (provider.FormData.AllKeys.AsParallel().Contains("demo")){ //read demo key value from form data successfully } else{ //failed to read demo key value from form. } } } return Request.CreateResponse(HttpStatusCode.OK, "OK"); }); return task; } ... 

我创建了一个MediaTypeFormatter来解码multipart / form-data并通过模型绑定提供HttpPostedFileBase 。 它使文件上传与任何其他API参数一样简单。 它当前将完整文件上载加载到内存中,但可以轻松调整格式化程序以将上载的数据写入临时上载目录。

https://gist.github.com/Danielku15/bfc568a19b9e58fd9e80

只需在API配置中注册格式化程序,您就可以在数据传输模型中使用它了:

 Configuration.Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());