2017-04-04 114 views
1

我想上传一个文件,我想将当前MVC HttpContext.Current.Request.Files传递给Web API。发送ASP.NET MVC HttpContext到Web Api HttpContext

我试图通过HttpFileCollectionBase作为参数传递给API,但它总是空。 控制器

public object UploadAttachment(string param1, int param2, HttpFileCollectionBase files) 
{ 
    string _url = _restUrl + param1+ "/Folders/" + param2+ "/UploadAttachment"; 
    HttpResponseMessage _response = SendJsonRequest(_url, HttpMethod.Post, files); 
    var ret = DeserializeResponse(_response); 
    return ret; 
} 

API代码

[HttpPost] 
[Route("Archives/{param1}/Folders/{param2}/UploadAttachment")]  
public IHttpActionResult UploadAttachment([FromUri]string param1, [FromUri]int param2, [FromBody] HttpFileCollectionBase files) 

查看代码

using (Ajax.BeginForm("UploadAttachment", null, new { param1 = Model.Param1 }, new AjaxOptions { HttpMethod = "POST", OnSuccess = "uploadAttachmentSuccess" }, new { id = "uploadAttachment", enctype = "multipart/form-data" })) 
        { 
        <div class="row"> 
         <div class="col-xs-10"> 
          <div class="input-group"> 
           <label class="input-group-btn" title=""> 
            <span class="btn btn-primary"> 
             <input type="file" name="file_upload" id="file_upload" style="display: none;" multiple /> 
             Browse 
            </span> 
           </label> 
           <input type="text" id="file_upload_name" class="form-control" readonly> 
          </div> 
         </div> 
         <div class="col-xs-2"> 
          <button type="submit" class="btn btn-success" data-toggle="tooltip" id="btn-submit-upload" title="" disabled> 
           Upload 
          </button> 
         </div> 
        </div> 
        <div class="row"> 
         <div class="col-xs-12" id="warning-format"> 
         </div> 
        </div> 
        } 

SendJsonRequest实现

  protected virtual HttpResponseMessage SendJsonRequest(string url, HttpMethod method, object objectToSerialize = null, bool tryToRefreshToken = true) 
    { 
     ... 
     HttpRequestMessage _request = new HttpRequestMessage(method, _uri); 
     if (objectToSerialize != null) 
     { 
      string _serializedJSONObject = JsonConvert.SerializeObject(objectToSerialize); 
      _request.Content = new StringContent(_serializedJSONObject); 
      _request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
     }... 
+0

您是否使用“文件”类型输入来浏览和上传文件? – Wheels73

+0

是的,MVC操作检测到它,但是当我尝试从我的MVC控制器传递文件到Web Api控制器时,它变为空。 – Caloyski

+0

你如何发布到控制器?阿贾克斯?你能发布你的视图/ ajax邮编吗? – Wheels73

回答

2

我创建了一个样本从MVC控制器将文件上传到网络API控制器,它的工作完美

MVC控制器:

[ActionName("FileUpload")] 
    [HttpPost] 
    public ActionResult FileUpload_Post() 
    { 
     if (Request.Files.Count > 0) 
     { 
      var file = Request.Files[0]; 

      using (HttpClient client = new HttpClient()) 
      { 
       using (var content = new MultipartFormDataContent()) 
       { 
        byte[] fileBytes = new byte[file.InputStream.Length + 1];      file.InputStream.Read(fileBytes, 0, fileBytes.Length); 
        var fileContent = new ByteArrayContent(fileBytes); 
        fileContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") { FileName = file.FileName }; 
        content.Add(fileContent); 
        var result = client.PostAsync(requestUri, content).Result; 
        if (result.StatusCode == System.Net.HttpStatusCode.Created) 
        { 
         ViewBag.Message= "Created"; 
        } 
        else 
        { 
         ViewBag.Message= "Failed"; 
        } 
       } 
      } 
     } 
     return View(); 
    } 

网络API控制器:

[HttpPost] 
    public HttpResponseMessage Upload() 
    { 
     if(!Request.Content.IsMimeMultipartContent()) 
     { 
      throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
     } 
     if (System.Web.HttpContext.Current.Request.Files.Count > 0) 
     { 
      var file = System.Web.HttpContext.Current.Request.Files[0]; 
      .... 
      // save the file 
      .... 
      return new HttpResponseMessage(HttpStatusCode.Created); 
     } 
     else 
     { 
      return new HttpResponseMessage(HttpStatusCode.BadRequest); 
     } 
    } 

有关在Web Api中保存文件的更多信息,请参阅Web API: File Upload

希望有所帮助!

+0

它的工作原理,谢谢! client.PostAsync(requestUri,content).Result是关键! – Caloyski

+0

很高兴你找到了你的钥匙! :) –