簡體   English   中英

將文件從 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 Web 應用程序。

我需要能夠上傳文件,然后將它們轉發到 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 應用程序有一個控制器函數,它接受表單提交並嘗試發布到 API。

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

HttpPostedFileBase[] Files

我不知道如何將HttpPostedFileBase[] Files文件轉換為 Web API 所需的List<IFormFile> Files格式。

我嘗試使用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;
    }

我需要能夠上傳文件,然后將它們轉發到 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 Core 中操作方法

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

測試結果

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM