2017-06-16 26 views
0

我有一個ASP.Net核心Web API發送IFormFile到ASP.Net核心網絡API,像這樣限定的控制器POST方法:無法使用C#客戶

[HttpPost("SubmitFile")] 
public async Task<IActionResult> SubmitFile(IFormFile file) 
{ 
} 

我有一個客戶端的方法調用API SubmitFile()方法,這樣的定義:

[HttpPost] 
public async Task<IActionResult> Index(ICollection<IFormFile> files) 
{ 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri(_options.SiteSpecificUrl); 

     foreach (var file in files) 
     { 
      if (file.Length <= 0) 
       continue; 

      var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"'); 
      var fileContent = new StreamContent(file.OpenReadStream()); 
      fileContent.Headers.Add("X-FileName", fileName); 
      fileContent.Headers.Add("X-ContentType", file.ContentType); 

      var response = await client.PostAsync(_options.WebApiPortionOfUrl, fileContent); 
     } 
    } 

    return View(); 
} 

當執行客戶端發送,在服務器側在SubmitFile一個斷點()表示該文件參數爲空。我怎樣才能正確地發送文件?保留服務器端API非常重要,因爲我有Swashbuckle/Swagger正確生成可以發送文件的UI。

+3

我敢肯定,你不能接受一個接口作爲模型綁定參數。你必須使用具體的類。 –

+0

你指的是SubmitFile(IFormFile文件)?請解釋... – stellaOctangula

+0

不,像'List ',而不是'ICollection'。雖然,閱讀文檔,它可以接受'IEnumerable '。請參閱https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads –

回答

1

我發現了一些方法來做到這一點。這是最簡單的。注意,這是一個ASP.Net核心客戶端解決方案:

[HttpPost] 
public async Task<IActionResult> Index(ICollection<IFormFile> files) 
{ 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri(_options.SiteSpecificUrl); 

     foreach (var file in files) 
     { 
      if (file.Length <= 0) 
       continue; 

      var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"'); 

      using (var content = new MultipartFormDataContent()) 
      { 
       content.Add(new StreamContent(file.OpenReadStream()) 
       { 
        Headers = 
        { 
         ContentLength = file.Length, 
         ContentType = new MediaTypeHeaderValue(file.ContentType) 
        } 
       }, "File", fileName); 

       var response = await client.PostAsync(_options.WebApiPortionOfUrl, content); 
      } 
     } 
    } 
} 

該控制器方法是從.cshtml頁稱爲如下:

@{ 
    ViewData["Title"] = "Home Page"; 
} 

<form method="post" asp-action="Index" asp-controller="Home" enctype="multipart/form-data"> 
    <input type="file" name="files" multiple /> 
    <input type="submit" value="Upload" /> 
</form> 

這種形式顯示兩個按鈕,「選擇文件「,其中提供了」選擇文件「對話框和」上傳「,它調用HomeController.Index方法。