【问题标题】:File Upload on unstable internet connection solution互联网连接不稳定的文件上传解决方案
【发布时间】:2013-07-30 21:38:50
【问题描述】:

所以我有一个文件传输网站,它使用 PHP 和 HTML5 开发。该站点应该处理大量文件传输(100MB - 4GB 文件大小)。 HTML5 主要是将文件分割成更小的尺寸。它适用于稳定的连接。

但是在某些情况下,由于互联网连接突然断开并打开一瞬间,文件上传会被切断。

我的主要问题是,无论如何在 php 或 html5 / javascript.. 中都可以处理此类问题。例如:如果连接仅中断几秒钟,脚本仍将继续运行,当连接再次打开时,它将继续文件上传?

或者如果这样的事情是不可能的,有没有办法检测到互联网掉线,并显示警报(“互联网掉线”);类似的东西?

谢谢

【问题讨论】:

  • 您可以发送块或监视发送/接收的字节,但这会很复杂。您可以轻松地在 ajax 本身上执行错误处理程序以提醒用户。
  • 你可以用 js 破解网络连接使用这个代码navigator.onLine 如果是连接返回 true,如果不是返回 false...
  • @maxART 这不是检测互联网连接是否存在的可靠方法。 developer.mozilla.org/en-US/docs/Web/API/…
  • 如果请求失败,您可以简单地重试自动发送块的次数,然后允许用户在设置的自动重试次数失败后手动发起重试。事实上,这就是Fine Uploader 为您所做的。全面披露:我维护 Fine Uploader。

标签: php javascript html cakephp file-upload


【解决方案1】:

我最近遇到了一个问题,涉及 FTP 上的大型二进制信号文件被丢弃损坏。随后,我们与 FTP 解决方案一起调查了使用基于 Web 的上传的选项,类似于您似乎正在寻找的那种处理方式。最稳健的解决方案仍然是使用 rsync 实现和连续校验和。

也就是说,HTML5 API 中似乎直接缺少的选项是能够在块本身中发送块的哈希或校验和,以便透明地完成对数据 blob 完整接收的验证.

您应该基本上可以通过对切片数据进行一些处理并在发送之前将其与 blob 组合来实现这一点。

            while( start < SIZE ) {
                var chunk = blob.slice(start, end);
                //var chunkHash = chunk.ComputeHash(); // e.g. CRC32 or Adler
                //chunk = chunkHash + chunk
                uploadFile(chunk);
                start = end;
                end = start + BYTES_PER_CHUNK;
            }

在另一端,您提取前 n 个字节并计算其余部分的哈希值,然后将前 n 个字节与您的数据进行比较。

一些启发灵感的文章: uploading a file in chunks using html5 是我认为处理文件上传的好地方 how to merge chunks of file (result of html5 chunking) into one file fast and efficient

最后,可能值得研究预先存在的库并进行一些“退出”测试以确定性能最佳的库。 http://www.plupload.com/ 似乎有一些追随者(不附属且未经测试)。

【讨论】:

  • 计算哈希客户端真的不值得麻烦。这样的操作非常低效,并且会显着影响应用的性能,尤其是在涉及大文件时。
  • 同意客户端的散列在性能方面并不理想。然而,在数据完整性方面,该策略并非由性能驱动。我假设连接本身比在块上处理哈希的时间要慢得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 2016-01-08
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
相关资源
最近更新 更多