2017-02-13 102 views
3

在我的ASP.NET MVC項目中,我試圖從Controller action方法將圖像發佈到API控制器方法。計劃是利用此API將其他客戶端用於上傳圖片。將MultipartFormDataContent從Controller Action方法發佈到WebApi Post方法

我能夠成功地從Controller Action方法中點擊API Post方法,但無法傳遞圖像對象。

這裏是我的HomeController.csUpload操作方法

[HttpPost] 
public async Task<ActionResult> Upload(FormCollection formCollection) 
{ 
    var baseUri = "http://localhost/api/Process"; 

    HttpPostedFileBase file = Request?.Files[0]; 

    if (file == null || (file.ContentLength <= 0) || string.IsNullOrEmpty(file.FileName)) 
     return new EmptyResult(); 

    string fileName = file.FileName; 
    byte[] fileBytes = new byte[file.ContentLength]; 

    HttpContent stringContent = new StringContent(fileName); 
    HttpContent fileStreamContent = new StreamContent(file.InputStream); 
    HttpContent bytesContent = new ByteArrayContent(fileBytes); 

    using (var formDataContent = new MultipartFormDataContent()) 
    { 
     formDataContent.Add(stringContent, "fileName", fileName); 
     formDataContent.Add(fileStreamContent, "inputStream", fileName); 
     formDataContent.Add(bytesContent, "fileBytes", fileName); 
     using (var httpClient = new HttpClient()) 
     { 
      formDataContent.Headers.ContentType = 
       MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded"); 

      var response = await httpClient.PostAsync(baseUri, formDataContent); 
      var content = await response.Content.ReadAsStringAsync(); 
      //Handle the response 
     } 
    } 
    return View("Result"); 
} 

在從ApiController繼承我的過程控制,我有以下的郵政法

[HttpPost] 
public async Task<string> Post([FromBody]MultipartFormDataContent formDataContent) 
{ 
    Task<string> imageContent = Request.Content.ReadAsStringAsync(); 
    string body = imageContent.Result; 
    ImageResponse imageResponse = null; 
    //................. 
    //................. 
    return someValue 
} 

這裏參數formDataContent總是空和Request.Content.ReadAsStringAsync()是空

+0

你嘗試'Request.Content.ReadAsMultipartAsync' ? – Jag

回答

1

嘗試從控制器這樣

//...other code removed for brevity 

using (var form = new MultipartFormDataContent()) { 

    var stringContent = new StringContent("fileToUpload"); 
    form.Add(stringContent, "fileToUpload"); 

    var streamContent = new StreamContent(file.InputStream); 
    streamContent.Headers.ContentType = MediaTypeHeaderValue.Parse(file.ContentType); 
    streamContent.Headers.ContentLength = file.ContentLength; 
    streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { 
     Name = "fileToUpload", 
     FileName = file.FileName 
    }; 
    form.Add(streamContent); 

    using (var httpClient = new HttpClient()) { 

     var response = await httpClient.PostAsync(baseUri, form); 

     //...other code removed for brevity 
    } 
} 

然後通過提取發送的信息處理它在ApiController ...

[HttpPost] 
public async Task<IHttpActionResult> Post() { 
    var content = Request.Content; 
    //get file name from content disposition 
    var fileName = content.Headers.ContentDisposition.FileName; 
    //Get file stream from the request content 
    var fileStream = await content.ReadAsStreamAsync(); 

    //...other code removed for brevity 

    return Ok(); 
} 

參考這樣的回答:Upload image using HttpClient

+0

httpContent.Headers.ContentDisposition爲null – HaBo

+0

只是做了這個httpContent.Headers.ContentDisposition?.FileName ?? 「image.jpg的」;休息是工作感謝 – HaBo