2017-02-13 4 views
3

В моем проекте ASP.NET MVC я пытаюсь отправить изображение из метода действия контроллера в метод контроллера API. План заключается в том, чтобы использовать этот API для других клиентов, чтобы использовать для загрузки изображений.Опубликовать MultipartFormDataContent от метода действия контроллера до метода WebApi Post

Я могу успешно ударить по методу API Post из метода Action Control, но не могу передать объект изображения.

Вот мой 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