【问题标题】:Stream multipart request body without waiting for it to upload first流式传输多部分请求正文,而无需等待它先上传
【发布时间】:2020-07-10 09:22:59
【问题描述】:

是否可以在发送 POST 请求后立即向控制器发送 POST 请求并读取 HttpContext.Request.Body 流(例如,如果文件为 10GB 大)?如果我有这样的表格:

<form method="post" enctype="multipart/form-data">

还有这样的控制器:

public class FileController : ControllerBase 
{
    [HttpPost("[action]")]
    public async Task Upload() 
    {
        var stream = HttpContext.Request.Body;
    }
}

如果我提交一个文件,它会先上传文件(正如我在浏览器中看到的那样),然后它会点击控制器,整个文件保存在一个临时文件中,如您在此处看到的:@987654321 @

我可以验证它是否将上传的文件保存到磁盘,这不适用于我的应用程序,因为我没有无限存储空间。我的最终目标是将文件上传到 FTP,所以请求是这样的:

client -> service -> FTP

我做错了什么?

【问题讨论】:

  • 查看stackoverflow.com/questions/36437282/…。似乎您可以阅读 MultipartSection 流并将内容定向到 FTP 服务。
  • @KirylZ 我实际上已经在使用 MultipartReader 等,但问题是在上传完成之前代码没有在我的控制器中被命中。
  • 你的意思是在服务器端创建临时文件之前?您是否尝试过删除默认活页夹?
  • @KirylZ 抱歉回复晚了。那确实奏效了。如果你想回答,我可以选择它作为答案,请继续!

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


【解决方案1】:

Dealing with large file uploads on ASP.NET Core 1.0 描述了一系列解决方案。

这里没有提到一件重要的事情——你必须删除默认的活页夹。否则缓冲将开始。这是如何 - Upload large files with streaming

【讨论】:

  • 再次感谢 - 它运行良好。由于这条线Since model binding doesn't read the form, parameters that are bound from the form don't bind (query, route, and header continue to work),我需要做一些黑客攻击才能让它工作。这意味着我不能传入任何 POST 参数或表单数据。我已经在标题中添加了我必要的东西,它可以完美地工作,但有点像黑客。
  • 所以你想在请求中传递几个参数?喜欢文件和其他内容?
  • 基本上,是的。文件是其中之一,保存文件的路径是另一个。我必须添加一个X-Upload-Path 标头以及将其传递给它的请求。第二个我开始做类似HttpContext.Request.Form 的事情,它会将整个上传的文件加载到内存或磁盘上
  • 我建议将所有参数传递到正文中,并将它们与边界和 Content-Disposition 标头分开。然后,您将通过调用 MultipartReader.ReadNextSectionAsync() 将它们作为 Sections 单独获取。
  • 是的,这绝对是一个不错的选择。但是,我只需要路径,所以我不会被它打扰
猜你喜欢
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多