将文件从 ASP.NET MVC 4.6 应用程序发布到 ASP.NET Core Web API

Posting a file from ASP.NET MVC 4.6 application to ASP.NET Core Web API

我在 .NET Framework 4.6 中使用了一个 ASP.NET MVC 网络应用程序。

我需要能够上传文件,然后将它们转发到 ASP.NET Core 3.1 Web API。

问题是我不知道如何将文件从客户端应用程序发送到 API。

API 接受这样的请求:

public class ReportUploadRequest
{
    public List<IFormFile> Files { get; set; }
    public int FolderId { get; set; }
    public int BrokerId { get; set; }
}

和 ASP.NET MVC 应用程序有一个控制器功能,它接受表单提交并尝试 post 到 API。

表单中的文件在 ASP.NET MVC 中接收,如下所示:

HttpPostedFileBase[] Files

我不知道如何将 HttpPostedFileBase[] Files 文件转换为 Web API 所需的 List<IFormFile> Files 格式 API。

我已尝试使用 List<IFormFile> Files 在我的控制器中接收文件,但 Files 在提交时为空

我如何准备我的表单以便以适合 Web 的格式使用 API?

我不确定这就是您所要求的,但我认为它可能是。我发现只要我能从二进制文件中得到一些东西,那么我就是黄金。这也为我提供了与其他语言(如 C++)的良好互操作性。

如果不是你问的..告诉我,我会删除我的答案。

这就是我所做的。我特别需要将二进制数据传递到我的控制器并返回二进制数据。

对于我的用例,秘密在 application/octet-stream.

[Route("api/[controller]")]
[ApiController]
public class SomeDangController : ControllerBase
{
    [HttpPost]
    [Produces("application/octet-stream")]
    public async Task<Stream> GetBinaryThingy()
    {
        using (var reader = new StreamReader(HttpContext.Request.Body))
        {
            using (MemoryStream ms = new MemoryStream())
            {
                await reader.BaseStream.CopyToAsync(ms);

                var buffer = ms.ToArray();
                //buffer now holds binary data from the client
            }
       }
       byte[] bytes_return = null  //populate your binary return here.
       return new MemoryStream(bytes_return);
   }
}

而在客户端.. 是这样的:

    public async System.Threading.Tasks.Task<byte[]> PostBinaryStuffAsync(byte[] buffer)
    {
        ByteArrayContent byteContent = new ByteArrayContent(buffer);

        var response = await client.PostAsync(dangServerURL, byteContent);

        var responseBytes = await response.Content.ReadAsByteArrayAsync();

        return responseBytes;
    }

I need to be able to upload files and then forward them to a ASP.NET Core 3.1 Web API.

为了达到你的要求,你可以参考下面的代码片段。

在 ASP.NET MVC 控制器动作中

public async Task<ActionResult> UploadFile(HttpPostedFileBase[] files)
{
    var formContent = new MultipartFormDataContent();

    foreach (var file in files)
    {
        formContent.Add(new StreamContent(file.InputStream), "files", Path.GetFileName(file.FileName));

    }

    var myHttpClient = new HttpClient();
    var response = await myHttpClient.PostAsync("https://xxxx/xxxx/UploadFile", formContent);

    if (response.StatusCode == System.Net.HttpStatusCode.OK)
    {
        //...
    }

在ASP.NET核心动作方法

public async Task<IActionResult> UploadFile([FromForm]List<IFormFile> files)
{
    //...

测试结果