如何通过ajax上传文件的进度?

时间:2011-05-02 01:59:16

标签: php ajax file-upload progress-bar

到目前为止,我已经想出如何使用Ajax和PHP异步上传文件,没问题。但我希望得到已经上传的文件的百分比,因为它正在上传,经过数小时的研究后,我找不到一个好方法来执行此操作without cheating

Some implementations我见过使用Flash上​​传,在Flash中获取百分比显然相当常见,但如果可以的话,我想避免这种情况。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

核心问题是RFC 1867,即通过multipart/form-data MIME类型通过HTTP上传文件的规范,没有提供任何提供文件上传进度的方法。

文件上传实际上只是一种奇特的表单提交。在整个上载完成之前,依赖于前端Web服务器首先接受请求的CGI脚本,PHP和所有其他Web技术可能实际上不会开始执行。这意味着他们通常甚至不知道上传何时开始,只有在完成后才知道。

PHP的APC扩展的新版本包括a workaround for this problem,它执行一些级别的黑魔法,使其能够更早地了解上传内容。但它只能作为mod_php的一部分。开发者似乎没有plans to support it under FastCGI

另一个服务器端选项是the "uploadprogress" PECL extension。我不完全确定它使用什么样的黑魔法。 The source表明它实际上是在处理multipart MIME部分。 (这表明至少有一些SAPI流在客户端上传时会向PHP形成数据。我知道至少有一些FastCGI服务器会在传递之前缓冲整个请求,所以这可能不适合你.YMMV。)

这两个选项都适用于普通文件上传。 Ajax - 或者更确切地说,XMLHttpRequest - 不支持文件上载操作。此领域的大部分解决方法都涉及创建iframe并在那里提交表单,这也意味着其他人的客户端工作。如果你要经历那种级别的环跳,你也可以使用一个现代文件上传小部件。

就个人而言,我使用Plupload,一个Javascript小部件,可以与每个人最喜欢的Javascript库jQuery一起使用。其他人发誓Uploadify。无论如何,这两个小部件都提供了高度的用户反馈来上传进度。它们可能比APC或uploadprogress更容易实现,并且具有被其他人彻底构建和测试的优势。

Plupload支持多个上传引擎,包括HTML5,Gears,Flash,Silverlight,oldschool HTML4等。在HTML5,Flash和Silverlight之间,您几乎只覆盖了100%的受众。它还允许您订阅事件并让您自己的代码执行魔术。例如,如果您需要服务器端文件上载进度信息,则可以让客户端定期将更新发送到其他脚本。如果您经常让客户上传巨大的文件并且您想要实时了解它,这将非常有用。

tl; dr:上传很难,让我们去客户端!

答案 1 :(得分:1)

是的,我不喜欢那种“作弊”方法,在我看来,最好的方法是使用APC及其方法,apc_fetch

使用ajax制作apc_fetch,使用指定上传的唯一键,将返回您需要的内容..即上传的字节数/总字节数。

然后只需使用javascript进行进度条。

我听说chrome和safari不允许你在上传后进行ajax调用,工作arround包括使用iframe用apc标识符进行调用。