2015-07-13 79 views
0

我是ASP.NET Web API的新用户。我有一个示例FileUpload web api(来自某个站点)将文件上传到服务器。 以下工作正常上传文件。如何将文件和参数一起发布到webapi方法?

public async Task<HttpResponseMessage> FileUpload() 
     { 
      // Check whether the POST operation is MultiPart? 
      if (!Request.Content.IsMimeMultipartContent()) 
      { 
       throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
      } 

      // Prepare CustomMultipartFormDataStreamProvider in which our multipart form 
      // data will be loaded. 
      //string fileSaveLocation = HttpContext.Current.Server.MapPath("~/App_Data"); 
      string fileSaveLocation = HttpContext.Current.Server.MapPath("~/UploadedFiles"); 
      CustomMultipartFormDataStreamProvider provider = new CustomMultipartFormDataStreamProvider(fileSaveLocation); 
      List<string> files = new List<string>(); 

      try 
      { 
       // Read all contents of multipart message into CustomMultipartFormDataStreamProvider. 
       await Request.Content.ReadAsMultipartAsync(provider); 

       foreach (MultipartFileData file in provider.FileData) 
       { 
        files.Add(Path.GetFileName(file.LocalFileName)); 
       } 

       // Send OK Response along with saved file names to the client. 
       return Request.CreateResponse(HttpStatusCode.OK, files); 
      } 
      catch (System.Exception e) 
      { 
       return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e); 
      } 
     } 
     // We implement MultipartFormDataStreamProvider to override the filename of File which 
     // will be stored on server, or else the default name will be of the format like Body- 
     // Part_{GUID}. In the following implementation we simply get the FileName from 
     // ContentDisposition Header of the Request Body. 
     public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider 
     { 
      public CustomMultipartFormDataStreamProvider(string path) : base(path) { } 

      public override string GetLocalFileName(HttpContentHeaders headers) 
      { 
       return headers.ContentDisposition.FileName.Replace("\"", string.Empty); 
      } 
     } 

但是,我想送一个parameter称为string'token'使用[FromBody]是有可能下面的方法?

要求:

public async Task<HttpResponseMessage> FileUpload([FromBody] string token) 
    { 
    //somecode here 
    } 

所以,基本上我们可以multiple Content-Type数据发送到Web API?请建议。我正在使用Fiddler来测试webapi。

如:

请求体(JSON): { “令牌”: “FV00VYAP”}

+0

我也有这个麻烦。我最终做的是base64编码要上传到客户端的文件,然后将其作为属性添加到我的PostModel中。 – Martin

回答

1

您可以通过查询字符串传递额外的内容,然后从CustomMultipartFormDataStreamProvider阅读。

// Read all contents of multipart message into CustomMultipartFormDataStreamProvider. 
       await Request.Content.ReadAsMultipartAsync(provider); 

然后你可以使用provider.FormData阅读你通过沿多余的值。

// Show all the key-value pairs. 
     foreach (var key in provider.FormData.AllKeys) 
     { 
      foreach (var val in provider.FormData.GetValues(key)) 
      { 
       Trace.WriteLine(string.Format("{0}: {1}", key, val)); 
      } 
     } 

查看http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-part-2了解更多详情。

相关问题