7

尚未发布的Delphi 2010 应用程序允许用户将他们的文件上传到我的服务器。现在我正在使用 HTTPS POST 发送文件,(简化的)算法基本上是:

  1. 将文件拆分为“切片”(每个 256KB)
  2. 对于每个切片,将其发布到服务器

IE。对于 1MB 的文件:

--> Get Slice #1 (256KB)
--> Upload Slice #1 using TidHTTP.Post()

--> Get Slice #2 (256KB)
--> Upload Slice #2 using TidHTTP.Post()

--> Get Slice #3 (256KB)
--> Upload Slice #3 using TidHTTP.Post()

--> Get Slice #4 (256KB)
--> Upload Slice #4 using TidHTTP.Post()

我正在使用Indy 10。我(ab)一遍又一遍地使用我的分析器,除了更改上传例程本身之外,没有太多可以优化的地方。

我也在使用多线程,即使我尽了最大努力优化我的代码,我的基准测试仍然告诉我我可以做得更好(还有其他优化良好的软件可以实现更好的时序......几乎是两倍像我的上传程序一样快!)

我知道这不是我的服务器的错……以下是我仍然需要探索的想法:

  1. 我尝试在单个 POST 中对切片进行分组,这自然会提高性能(20-35%),但现在恢复能力降低了。

  2. 我也考虑过使用 SFTP / SSH,但我不确定它是否很快。

  3. 使用 web sockets 来实现可恢复的上传(比如这个组件),我也不确定速度。

现在我的问题是:有什么办法可以加快上传速度吗?我愿意接受任何我可以实施的建议,包括命令行工具(如果许可证允许我将它与我的应用程序一起发布),前提是:

  1. 支持可续传
  2. 快速地!
  3. 合理的内存使用
  4. 安全并允许登录/用户身份验证

此外,由于主要的安全问题,我不想实现 FTP。

非常感谢!

4

1 回答 1

5

我建议TIdHTTP.Post()为整个文件做一个单独的文件,而不是把它分块。您可以使用这些TIdHTTP.OnWork...事件来跟踪发送到服务器的字节数,以便在需要时知道从哪里恢复。恢复时,您可以使用该TIdHTTP.Request.CustomHeaders属性包含一个自定义标头,该标头告诉服务器您要从哪里恢复,因此它可以在接受新数据之前将其先前的文件回滚到指定的偏移量。

于 2012-02-29T01:00:14.647 回答