上传超大的文件(>1GB)的建议

3
我知道在SF中存在此类问题,但它们非常具体,我需要一个通用建议。我需要一项上传用户文件的功能,这些文件可能超过1 GB大小。此功能将是现有文件上传功能的附加功能,该功能适用于较小的文件。现在,以下是一些选项:
  1. 使用HTTP和Java applet。将文件分成块并在服务器上合并它们。但如何控制网络带宽。
  2. 使用HTTP和Flex应用程序。相对于浏览器兼容性和任何其他环境问题,这是否比applet更好?
  3. 使用FTP或SFTP而不是HTTP作为协议以实现更快的上传过程
请给出建议。
此外,我必须确保此上传过程不会妨碍其他用户的任务,换句话说,不要占用其他用户的带宽。有什么机制可以在网络层面上控制这种流量吗?
最终客户希望有FTP作为选项。但我认为通过编程处理文件的答案也很棒。
4个回答

13

你可以使用任何客户端语言(如Java应用程序、Flex等),并使用 HTTP PUT(不支持Flex)或POST 推送到服务器。在服务器端的Java代码中,在输入流循环中调整字节流量。以下是一个简单的示例片段,限制带宽速度不超过平均10KB/秒:

InputStream is = request.getInputStream();
OutputStream os =  new FileOutputStream(new File("myfile.bin"));
int bytesRead = 0;
byte[] payload = new byte[10240];

while (bytesRead >= 0) {
    bytesRead = is.read(payload);

    if (bytesRead > 0) 
        os.write(payload, 0, bytesRead);

    Thread.currentThread().sleep(1000);
}
(如果加入更多复杂性,则可以更准确地调节单个流的带宽,但考虑到套接字缓冲区等因素时会变得很复杂。通常,“好的足够”已经足够了。)

我的应用程序与上述内容类似--我们调节上游(POSTPUT)和下游(GET)的带宽。每天我们接受数百 MB 的文件,并测试过达到2GB(超过2GB会遇到烦人的Java int原始问题)。我们的客户端是Flex和curl。对我而言,它有效,对你也行。

虽然FTP很好,但使用HTTP可以避免许多(但不是全部)防火墙问题。


4
如果您想减少带宽使用量,可以考虑发送已压缩的数据(除非数据已经被压缩)。这可能会节省2-3倍的数据量,具体取决于您要发送的内容。

1

如果想要了解如何正确上传大文件的最佳实践,以及解决这个问题的各种方法,可以看看 flickr.com(可能需要注册才能进入上传页面)。

他们提供了多种选择,包括 HTTP 表单上传、Java 桌面客户端,还有一种我无法完全理解的基于 JavaScript 的小工具。似乎他们没有使用 Flash。


0

如果要将文件发送到服务器,除非必须使用HTTP协议,否则FTP是更好的选择。关于限速,至少从编程角度来看,我并不完全确定。

个人而言,似乎在服务器端处理上传速度上的限制更为合适。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接