代码之家  ›  专栏  ›  技术社区  ›  Sébastien Nussbaumer

在服务器端处理非常大的HTTP上载和下载的最佳方法

  •  4
  • Sébastien Nussbaumer  · 技术社区  · 15 年前

    我有一个即将到来的项目,我需要处理来自浏览器的非常大的上传(无论是经典的输入类型=“文件”还是Java applet),并寻找最好的工具来在服务器上完成这项工作。

    这些是我需要的:

    • 服务器内存消耗低
    • 能够将文件保存在服务器上的最终目标中(不复制周围的文件)
    • 不阻止Web服务器执行其他重要任务
    • 对高达2 GB的文件的良好处理
    • 文件授权(将在应用程序中授予权限)

    我仍然对要使用的技术有一定的自由度,因此我希望有一些建议,以便能够选择服务器上处理此任务的最佳技术:

    • ASP.NET?
    • 爪哇?
    • 亚马逊S3?
    • 其他选择?

    我更习惯微软的架构,但如果必要的话,我愿意改变:正如上面所说,我只是在寻找适合这份工作的最佳工具。

    谢谢!

    更新: 服务器端是我对这个问题真正感兴趣的部分 不是客户端。

    它看起来可能是微不足道的,但是当你开始挖掘一点的时候,你会发现.NET有4 MB的限制,下载会占用大量内存,这会阻塞其他线程(当你对线程的数量有限制时,如果一个线程可以在2 GB的时间内执行文件在Internet上上传/下载:好吧,这不会很好地扩展,会吗?)等。

    7 回复  |  直到 15 年前
        1
  •  6
  •   Rubens Farias    15 年前

    你需要:

    • 客户端代码(Java Applet、Silverlight等)以小块方式中断文件
    • 服务器端代码(ASP.NET,Java,无关紧要)构建这些文件

    我刚完成一个申请 确切地 就像那样,我会用Silverlight( WebRequest 异步),ASP.NET( IHttpHandler / IHttpAsyncHandler )和SQL Server 2005( UPDATETEXT / READTEXT )用于文件存储。

    更新 :关于ASP.NET服务器端代码:

    ASP.NET默认配置允许每个处理器有100个线程; 异步处理 不会阻止您的进程,您可以在那里直接将文件内容写入 context.Response.OutputStream .

    对于上传,您还将发送几个数据块,但在多个HTTP连接中;虽然这可能会导致HTTP头过热,但在我的测试中效果非常好。

        2
  •  4
  •   BalusC    15 年前
    • 服务器内存消耗低

    将输入直接写入磁盘,而不是写入内存。
    在Java术语中,使用FielOutPutsFiels/BuffEdEdutsStudio。

    • 能够将文件保存在服务器上的最终目标中(不复制周围的文件)

    见上文。

    • 不阻止Web服务器执行其他重要任务

    每个请求都在自己的线程中运行,所以没有什么可担心的。这取决于你如何编码。

    • 对高达2 GB的文件的良好处理

    直接将文件写入磁盘时无问题。
    在Java术语中,可以使用 Apache Commons FileUpload 这是API。

    • 文件授权(将在应用程序中授予权限)

    不确定您所说的授权级别。磁盘文件系统级别?Web应用程序级别?客户端级别?

        3
  •  1
  •   Piskvor left the building Rohit Kumar    15 年前

    在客户方, input type="file" 通过http-post有其缺点——特别是,它不能压缩上传(可能不是问题),也不能恢复传输(当1000 MB的上传在990 MB时失败时,这会很痛苦)。swfupload虽然在其他方面很好,但它依赖于浏览器的HTTP Post实现。

    我可能会在客户端上使用Java Applet——这将允许在上传之前建立连接并检查必要的权限;尽管该路径也有其问题:

    • fs访问权限(签名小程序?)
    • 编写自己的HTTP上载程序
    • 代理处理

    还可以选择返回到普通的旧HTTP POST。

    服务器端几乎可以写入任何内容,只要您能够在数据到达时对其进行处理(也就是说,不要等到您拥有整个文件时再进行处理)。

        4
  •  0
  •   LiamB    15 年前

    您可以使用ASP.NET中的异步文件上载来完成此操作。使用Flash将其呈现给用户。

    http://swfupload.org/node/47

        5
  •  0
  •   Josh Mein    15 年前

    你可以用 uploadify . 我以前用过好几次,它总是适合我的需要。它是一个异步文件上载程序,使用闪存允许多个文件在需要时一次上载。

        6
  •  0
  •   kirkus    15 年前
        7
  •  0
  •   Brian    15 年前

    根据我的经验,还有几条简短的笔记…

    1. 输入类型=文件根本无法可靠地工作于大型文件(由于内存问题)
    2. 一些文件上传组件可以解决内存问题,但是当从客户机到服务器的传输中丢失字节时,它们仍然存在问题。
    3. 你应该看看支持数据块化的Java小程序。

    它应该工作的方式是Java applet将文件分解成可管理的块并从字节中创建散列。一旦服务器接收到一个块,它就应该将接收到的字节的哈希值与Java applet提供的哈希值进行比较。

    如果哈希值不匹配,请重试该块。如果它们匹配,则转到下一个块。然后使用一个工具将所有块放回一起。