2017-02-13 13 views
3

私のASP.NET MVCプロジェクトでは、コントローラアクションメソッドからAPIコントローラメソッドに画像をポストしようとしています。このAPIを他のクライアントに活用して、画像をアップロードすることを計画することです。Controller ActionメソッドからWebApi PostメソッドへのMultipartFormDataContentの投稿

Controller ActionメソッドからAPI Postメソッドを正常に表示できますが、イメージオブジェクトを渡すことができません。ここで

は私HomeController.csUploadアクションメソッドApiControllerから継承している私のプロセスコントローラで

[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"); 
} 

で、私は次のポスト方法

[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は常にnullで、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?ファイル名?? "image.jpg";残りは働いている – HaBo

関連する問題