我有一个 ASP.NET MVC 应用程序,其页面允许用户上传文件。这些文件将有数百兆字节。
我在客户端使用 FineUploader,如果浏览器支持它,它将使用 FileAPI/XHR,否则将回退到带有 enctype="multipart whatever" 的 Iframe/form。
所以在服务器端我需要评估Request.Files.Count > 1
. 如果true
,这是一个老式的上传,我会像Request.Files[0].InputStream.CopyTo(myFileStream)
其他方式一样保存文件Request.InputStreawm.CopyTo(myFileStream)
。
这是我编写的一些实际代码:https ://github.com/ronnieoverby/file-uploader/blob/master/server/ASP.NET%20MVC%20C%23/FineUpload.cs
这一切都很好,但在我的测试中,我注意到在整个文件上传之前,ASP.NET MVC 控制器操作和 HttpHandler 都不会开始处理,如果文件非常大,这很糟糕,因为这意味着它占用了很多Web 服务器的 RAM。
我发现了这个:Streaming large file uploads to ASP.NET MVC这听起来很有希望,但我真的不知道代码在他的应用程序中的位置。
所以,问题是:如何在 ASP.NET 中进行上传的同时将上传的文件流式传输到磁盘?
更新
我刚刚看到了一个以前没有深入了解的关键细节。从HttpPostedFile文档:
默认情况下,所有大于 256 KB 的请求(包括表单字段和上传的文件)都会缓冲到磁盘,而不是保存在服务器内存中。
好的,这解决了 Web 服务器的 RAM 利用率可能会在大量上传期间飙升的担忧。但是,仍然存在一个问题:文件完全传输到 Web 服务器后,服务器必须花时间将其移动到最终目的地。如果文件系统操作是副本(如果目标在另一个物理磁盘上则保证),则响应会被不必要地延迟。
老实说,我可以通过增加上传处理程序/操作的响应超时来忍受这一点。但是,将字节直接流式传输到它们的目的地会很好。