在ASP.NET中流式传输大文件上传

前端之家收集整理的这篇文章主要介绍了在ASP.NET中流式传输大文件上传前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个ASP.NET MVC应用程序与一个页面,允许用户上传文件。这些文件将是几百兆字节。

我正在客户端使用FineUploader,如果浏览器支持它,它将使用FileAPI / XHR,否则将使用enctype =“multipart whatever”来回溯到Iframe / form。

所以在服务器端我需要评估Request.Files.Count>如果是真的,这是一个旧的学校上传,我保存的文件像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文档:

By default,all requests,including form fields and uploaded files,
larger than 256 KB are buffered to disk,rather than held in server
memory.

好的,这解决了在大型上传期间Web服务器的RAM利用率可能上涨的担忧。但是,仍然有一个问题:文件完全传输到Web服务器后,服务器必须花时间将其移动到最终目的地。如果文件系统操作是副本(如果目的地在另一个物理磁盘上,则保证),则响应将不必要地延迟。

老实说,我可以通过增加上传处理程序/操作的响应超时来生活。但是,将字节直接传输到目的地是很好的。

解决方法

您可以以完全自定义的方式处理上传,而无需使用缓冲
HttpRequest.GetBufferlessInputStream方法。基本上,您可以访问原始的传入数据,并随意随意使用它。

我刚刚创建了一个将原始请求内容保存到文件的小样本:

>创建处理程序:

  1. public class UploadHandler : IHttpHandler
  2. {
  3. public void ProcessRequest(HttpContext context)
  4. {
  5. using (var stream = context.Request.GetBufferlessInputStream())
  6. using (var fileStream = File.Create("c:\\tempfile.txt"))
  7. {
  8. stream.CopyTo(fileStream);
  9. }
  10. }
  11. public bool IsReusable { get { return true; } }
  12. }

>在Web.config中注册

  1. <system.webServer>
  2. <modules runAllManagedModulesForAllRequests="true"/>
  3. <handlers>
  4. <add name="UploadHandler" verb="POST"
  5. path="/upload"
  6. type="UploadHandler"
  7. resourceType="Unspecified"/>
  8. </handlers>
  9. </system.webServer>

>创建一个带有表单的页面

  1. <form action="/upload" method="post" enctype='multipart/form-data'> &ltinput type="file" name="aa" id="aa"/><input type="submit"/></form>

猜你在找的asp.Net相关文章