【问题标题】:Save file directly to disk in ASP.NET without loading it into memory在 ASP.NET 中将文件直接保存到磁盘而不将其加载到内存中
【发布时间】:2014-09-12 11:31:25
【问题描述】:

我有一个 ASP.NET Web 应用程序,我希望我的用户能够上传大文件。但是,有些文件非常大,占用的内存过多。

原则上应该可以接收请求流并将其直接写入 FileWriter 流,无需先将整个文件加载到内存中。

我尝试访问Request.InputStream 并将其直接写入文件。它可以工作,但使用较大文件的测试表明 Request.InputStream 仅在整个请求已加载到内存后才可用。

有人能告诉我一种方法,我可以使用一种方法在 ASP.NET 中接收普通的Request.InputStream,然后直接将其写入文件而不先将其加载到内存中吗?

请注意,文件是通过浏览器中的正常请求发送的,方法是发布带有文件字段的表单。 (我实际上使用BlueImp JQuery File Upload,但我认为它与这个问题无关)

【问题讨论】:

  • 我相信这是 http 协议而不是 .NET 的限制。
  • 您的意思是该协议有效,因此您只能接收完整的请求,并且在收到整个请求之前无法开始处理请求?
  • 是的,但是,我找不到任何权威信息。

标签: asp.net file-upload


【解决方案1】:

该过程称为字节服务

Byte Serving: 字节服务是仅从服务器向客户端发送 HTTP/1.1 消息的一部分的过程。当 HTTP 服务器使用 Accept-Ranges 响应标头宣布其愿意为部分请求提供服务时,字节服务就开始了。然后,客户端使用 Range 请求标头从服务器请求文件的特定部分。

似乎 IIS 和 ASP.NET 能够处理 Accept-Range 标头。 Microsoft git 存储库中有一个Range Controller

这是一个article,它可能有助于配置 IIS 以处理这些请求。

【讨论】:

  • 我说的是让客户端向服务器发送文件。您的答案中的描述谈到客户接受部分响应。所以这似乎不是一回事。
  • 哦。你是对的。哑巴。我会继续寻找解决方案。
  • 防火墙内的一个顿悟诞生:您如何看待允许用户传递文件的URL并使用类似wget的函数将文件下载到服务器?跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 2015-07-13
  • 1970-01-01
  • 2018-08-31
  • 2021-05-03
  • 2015-05-14
  • 2015-12-14
相关资源
最近更新 更多