3

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

  1. 使用 HTTP 和 Java 小程序。以块的形式发送文件并在服务器上加入它们。但是如何限制 n/w。
  2. 使用 HTTP 和 Flex 应用程序。它是否比小程序 wrt 浏览器兼容性和任何其他环境问题更好?
  3. 使用 FTP 或 SFTP 而不是 HTTP 作为协议以加快上传过程

请建议。

此外,我必须确保此上传过程不会妨碍其他用户的任务,或者换句话说,不会占用其他用户的 b/w。任何可以在 n/w 级别完成以限制此类进程的机制?

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

4

4 回答 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) 下行带宽。我们每天接受 100 MB 的文件,并测试了高达 2GB 的文件。(超过 2GB 后,还有令人讨厌的 Java int 原语问题需要处理。)我们的客户既是 Flex 又是curl. 它对我有用,它可以为你工作。

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

于 2009-07-07T05:49:07.407 回答
4

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

于 2009-07-07T05:53:30.237 回答
1

有关上传大文件的良好做法示例以及处理它的各种方法,请查看 flickr.com(您可能需要注册才能访问上传者页面)

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

于 2009-07-07T21:18:44.823 回答
0

对于将文件发送到服务器,除非您必须使用 HTTP,否则 FTP 是要走的路。节流,我不完全确定,至少不是以编程方式。

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

于 2009-07-06T19:57:23.927 回答