【问题标题】:Unable to pass file to web api in ASP.NET MVC Core无法将文件传递到 ASP.NET MVC Core 中的 Web api
【发布时间】:2020-10-17 04:07:29
【问题描述】:

我正在开发一个 Angular 和 .NET Core 应用程序。我必须将从角度上传的文件传递给 WEB API。我的代码是:

public async Task ImportDataScienceAnalytics(string authToken, IFormFile file)
{
        var baseUrl = Import.GetBaseURL();

        var client = new RestClientExtended(baseUrl + "algorithm/import");
        var request = new RestRequest(Method.POST);


        request.AddHeader("authorization", authToken);
        string jsonBody = JsonConvert.SerializeObject(file);
        request.AddJsonBody(jsonBody);

        var response = await client.ExecutePostTaskAsync(request);
        var result = response.Content;
}

问题是我得到“未找到附件”。我认为问题是因为 IFormFile。我该如何解决这个问题,以便我可以将文件上传到 web api。

【问题讨论】:

  • 你为什么使用async void?我建议改用Task
  • 检查文件是否已填充...。您还需要从流中读取 IFormFile 和与文件流交互的接口。进一步/还有你为什么JsonConvert.SerializeObject(file);,就像你试图上传传递。
  • 我必须将此文件传递给 API @Seabizkit。 . .如何从 IFormFile 读取流并将其传递给 API,任何示例代码?
  • 首先下断点,检查IFormFile文件是否有内容。其次,您需要创建流。 if (file.Length > 0) { var filePath = Path.GetTempFileName(); using (var stream = System.IO.File.Create(filePath)) { await file.CopyToAsync(stream); } }
  • @WaleedNaveed bayram 已经给了你上面的答案 ;-)

标签: c# asp.net-core asp.net-web-api


【解决方案1】:

您似乎想使用RestClient从您的API操作将上传的文件发布到外部API,您可以参考以下代码sn-p。

var client = new RestClient(baseUrl + "algorithm/import");
var request = new RestRequest(Method.POST);

request.AddHeader("authorization", authToken);


using (var ms = new MemoryStream())
{
    file.CopyTo(ms);
    var fileBytes = ms.ToArray();

    request.AddFile("file", fileBytes, file.FileName, "application/octet-stream");
}

//...

Import动作的测试代码

public IActionResult Import(IFormFile file)
{
    //...

    //code logic here

【讨论】:

    【解决方案2】:

    您需要对代码进行以下更改。 var baseUrl = Import.GetBaseURL();

            var client = new RestClientExtended(baseUrl + "algorithm/import");
            var request = new RestRequest(Method.POST);
    
            byte[] data;
            using (var br = new BinaryReader(file.OpenReadStream()))
                data = br.ReadBytes((int)file.OpenReadStream().Length);
            ByteArrayContent bytes = new ByteArrayContent(data);
            MultipartFormDataContent multiContent = new MultipartFormDataContent
        {
            { bytes, "file", file.FileName }
        };
            //request.AddHeader("authorization", authToken);
            //string jsonBody = JsonConvert.SerializeObject(file);
            //request.AddJsonBody(jsonBody);
    
            /// Pass the multiContent into below post
            var response = await client.ExecutePostTaskAsync(request);
            var result = response.Content;
    

    不要忘记将变量 multiContent 传递给 post 调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-07
      • 2020-04-16
      • 1970-01-01
      • 2017-01-16
      • 2020-12-22
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多