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

时间:2009-07-06 19:40:02

标签: java networking file-upload large-files throttling

我知道SF中存在这类问题,但它们非常具体,我需要一个通用的建议。我需要一个功能来上传用户文件,其大小可能超过1 GB。此功能将成为应用程序中现有文件上载功能的附加组件,可满足较小的文件需求。现在,这里有一些选项

  1. 使用HTTP和Java小程序。以块的形式发送文件并将它们连接到服务器。但是如何限制n / w。
  2. 使用HTTP和Flex应用程序。它比浏览器兼容性的applet更好吗?任何其他环境问题?
  3. 使用FTP或更确切地说SFTP而非HTTP作为协议以加快上传过程
  4. 请建议。

    此外,我要确保此上传过程不会妨碍其他用户的任务,换句话说,不会占用其他用户的黑白。任何可以在n / w级别完成的机制来限制这些过程吗?

    最终,客户希望将FTP作为一种选择。但我认为以编程方式处理文件的答案也很酷。

4 个答案:

答案 0 :(得分:12)

使用您想要的任何客户端语言(Java App,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)下游带宽。我们每天接受100s MB的文件,并测试高达2GB。 (超过2GB时,需要处理棘手的Java int原语问题。)我们的客户端都是Flex和curl。它适用于我,它可以为你工作。

虽然FTP非常棒,但您可以通过使用HTTP避免许多(但不是全部)防火墙问题。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

有关上传大文件的良好做法示例以及解决方法的各种方法,请查看flickr.com(您可能必须注册才能访问上传页面)

它们提供了各种选项,包括HTTP表单上传,java桌面客户端或某种javascript驱动的小工具,我无法弄清楚。他们似乎没有在任何地方使用闪光灯。

答案 3 :(得分:0)

要将文件发送到服务器,除非 使用HTTP,否则FTP是可行的方法。限制,我不完全确定,至少不是以编程方式。

就个人而言,似乎在服务器端可以更好地完成上传速度的限制。