首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在ASP.NET中流式传输大型文件上载

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

Stack Overflow用户
提问于 2012-12-21 00:31:16
回答 2查看 10.2K关注 0票数 20

我有一个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服务器的大量内存。

我发现了这个:Streaming large file uploads to ASP.NET MVC,这听起来很有希望,但我真的不知道代码在他的应用程序中驻留在哪里。

因此,问题是:当ASP.NET仍在进行上传时,如何将上传的文件流式传输到磁盘?

更新

我只是看到了一个关键的细节,以前没有被理解。从HttpPostedFile文档中:

默认情况下,所有大于256 KB的请求(包括表单域和上传的文件)都缓冲到磁盘,而不是保存在服务器内存中。

好的,这解决了web服务器的RAM使用率在大型上传过程中可能会达到峰值的问题。但是,仍然存在一个问题:文件完全传输到web服务器后,服务器必须花费时间将其移动到其最终目的地。如果文件系统操作是拷贝(如果目标位于另一个物理磁盘上,则保证),则响应将被不必要地延迟。

老实说,我可能可以通过增加上载处理程序/操作的响应超时来接受这一点。但是,将字节直接流式传输到它们的目的地会更好。

EN

回答 2

Stack Overflow用户

发布于 2012-12-21 12:34:59

您可以通过完全自定义的方式处理上传,而无需使用HttpRequest.GetBufferlessInputStream方法进行缓冲。基本上,您可以访问原始传入数据,并可以自由地对其执行任何操作。

我刚刚创建了一个小示例,它将原始请求内容保存到一个文件中:

  1. 创建处理程序:

公共类UploadHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { using (var ProcessRequest= context.Request.GetBufferlessInputStream()) using (var fileStream = File.Create("c:\tempfile.txt")) { stream.CopyTo(fileStream);}}公共布尔IsReusable { get { return true;}}}

  • 在Web.config中注册:

  • Create a a page with a form:

票数 6
EN

Stack Overflow用户

发布于 2012-12-21 21:13:30

如果上传和流媒体正在消耗宝贵的服务器资源,那么您可能需要考虑将您的媒体文件托管在某种云上。使用ASP.NET可以使用Rackspace,Amazon Cloud API让您的用户直接将文件上传到CDN网络,然后以这种方式提供内容,我知道这没有回答您的问题,但许多人将或已经这样做了,并认为我会得到我的2美分。许多人仍然没有选择使用云,这让我很惊讶!一旦你上了CDN,你就再也回不去了。此外,与大多数CDN的,您还将获得一个流的URL为您的上传容器,它支持许多不同的电影类型,它的照明速度很快,不仅为您的用户上传太多,而且你的网站上永远不会有慢速度的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13976517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档