4

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

这些是我需要的东西:

  • 服务器内存消耗低
  • 能够将文件保存在服务器上的最终目的地(不复制文件)
  • 不阻塞网络服务器完成的其他重要任务
  • 良好处理高达 2 GB 的文件
  • 文件的授权(权限将在应用程序中给出)

我仍然对使用什么技术有一定的自由度,所以我想得到一些建议,以便能够选择服务器上最好的技术来处理这个任务:

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

我更习惯于 Microsoft Stack,但如有必要,我愿意进行更改:如上所述,我只是在寻找最适合这项工作的工具。

谢谢 !

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

看起来这可能是微不足道的,但是当您开始挖掘时,您会看到 .NET 的 4 Mb 限制,使用大量内存的下载,可以阻止其他线程(当您对线程数有限制时,并且如果一个线程可以在 Internet 上执行 2 Gb 文件上传/下载的持续时间:那么这不会很好地扩展,是吗?)等等。

4

7 回答 7

6

你需要:

  • 将文件分成小块的客户端代码(Java Applet、Silverlight 等)
  • 用于构建这些文件的服务器端代码(ASP.NET、Java 无关紧要)

我刚刚完成了一个完全一样的应用程序;我会使用 Silverlight ( WebRequestasync)、ASP.NET ( IHttpHandler/ IHttpAsyncHandler) 和 SQL Server 2005 ( UPDATETEXT/ READTEXT) 进行文件存储。

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

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

对于上传,您还将发送多个数据块,但在多个 HTTP 连接中;虽然这可能会由于 HTTP 标头而带来一些过热,但在我的测试中效果很好。

于 2009-11-04T16:20:21.560 回答
4
  • 服务器内存消耗低

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

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

往上看。

  • 不阻塞网络服务器完成的其他重要任务

每个请求都在自己的线程中运行,因此无需担心。这仅取决于您如何编码。

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

直接将文件写入磁盘时不会出现问题。
在 Java 术语中,您可以为此使用Apache Commons FileUpload API。

  • 文件的授权(权限将在应用程序中给出)

不确定您在谈论哪个级别的授权。磁盘文件系统级别?Web应用级别?客户端级别?

于 2009-11-04T16:31:16.180 回答
1

在客户端,input type="file"通过 HTTP POST 有其缺点 - 值得注意的是,它无法压缩上传(可能不是问题),也无法恢复传输(当 1000 MB 上传失败到 990 MB 时,这可能会很痛苦)。SWFUpload 虽然在其他方面都很棒,但它依赖于浏览器的 HTTP POST 实现。

我可能会在客户端上使用 Java 小程序——这将允许在上传之前建立连接并检查必要的权限;虽然这条路也有问题:

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

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

服务器端几乎可以用任何东西编写,只要您可以在数据到达时对其进行处理(即不要等到您拥有整个文件)。

于 2009-11-04T16:26:45.103 回答
0

您可以使用 asp.net 中的异步文件上传来完成。用闪光灯将其呈现给用户。

http://swfupload.org/node/47

于 2009-11-04T16:14:33.203 回答
0

您可以使用uploadify。我以前用过几次,它总是适合我的需要。它是一个异步文件上传器,如果需要,它使用 Flash 允许一次上传多个文件。

于 2009-11-04T16:15:38.100 回答
0

您可以使用 BITS 进行上传:

http://www.simple-talk.com/dotnet/.net-tools/using-bits-to-upload-files-with-.net/

于 2009-11-04T16:16:38.220 回答
0

根据我的经验,还有一些其他的快速笔记......

  1. input type=file 根本无法可靠地处理大文件(由于内存)
  2. 一些文件上传组件将解决内存问题,但是当从客户端到服务器的传输中丢失字节时,它们仍然存在问题。
  3. 您应该查看一个支持数据分块的 Java 小程序。

The way it should work is the java applet breaks the file into manageable chunks and creates a hash from the bytes. Once the server receives a chunk, it should compare a hash of the bytes received with the hash provided by the java applet.

If the hashes don't match, retry the chunk. If they do match, move on to next chunk. Then use a tool to bring all the chunks back together.

于 2009-11-04T17:03:26.473 回答