在 PHP 中创建文件进度条

Posted

技术标签:

【中文标题】在 PHP 中创建文件进度条【英文标题】:Creating a file progress bar in PHP 【发布时间】:2010-09-14 14:29:18 【问题描述】:

有谁知道在 php 中创建文件上传进度条的任何方法?我经常听说这是不可能的。

我有一个想法,但不确定它是否可行:正常上传文件,而是提交到 iframe。提交后,将文件信息(大小和临时位置)存储在会话中。同时,每隔 10 秒启动一次 AJAX 调用,以检查文件的大小与会话中存储的大小相比。这会将大小返回给 AJAX,然后会调整进度条的大小,并可能向用户显示上传的大小。

想法?

【问题讨论】:

【参考方案1】:

您已经很清楚如何做到这一点了。主要问题是在完成上传之前,您通常无法访问上传文件的大小。

有解决方法: 启用 APC,如果您包含一个名为“APC_UPLOAD_PROGRESS”的字段并使用 apc_fetch() 检索具有状态的缓存条目,则您可以访问此信息。

还有一个名为 uploadprogress 的插件,但它没有很好的文档记录并且不能在 Windows 上运行(最后我还是检查了)。

另一种方法是使用 Flash 来执行此操作。请参阅 FancyUpload 之类的脚本。

在 APC 出现之前,我必须用 C 语言编写一个 CGI 脚本,将信息写入文本文件。不过,现在 APC 似乎是一种更好的方法。

希望这会有所帮助。

【讨论】:

当我看到这个问题时,我也想到了APC的上传进度。我知道 Rasmus 甚至在某个地方为它创建了一个样本,但我现在找不到。【参考方案2】:

到目前为止,最常用的方法是 SWFUpload:http://www.swfupload.org/

但是, 使用纯 PHP 是可能的,只是非常困难且非常实验性。我看看能不能找到链接。

编辑: 根据 php.net 上的 cmets,从 5.2 开始,有一个处理上传进度的钩子。 http://us.php.net/features.file-upload#71564

更多解释:

http://www.dinke.net/blog/2006/11/04/php-52-upload-progress-meter/en/ http://blog.liip.ch/archive/2006/09/10/upload-progress-meter-extension-for-php-5-2.html

拉斯穆斯的例子:

http://progphp.com/progress.phps

【讨论】:

【参考方案3】:

你可以试试YUI或Prototype或JQuery

【讨论】:

jQuery 看起来是最好的方法!谢谢,不知道它有一个插件。【参考方案4】:

从 PHP 5.4 开始,它在会话扩展中:http://php.net//manual/pl/session.upload-progress.php

【讨论】:

太糟糕了,它在 2008 年......或 5.3 中不可用 :)【参考方案5】:

在纯 PHP 中,你是对的:这是不可能的。

如果您对此进行 AJAX 化,那么您可以按照您的描述进行操作。我见过的唯一进度表是 javascript 或 Flash,不过我想 Silverlight 也可以。

【讨论】:

【参考方案6】:

“老派”,但是一种 PHP + Perl 技术:http://www.raditha.com/php/progress.php

【讨论】:

【参考方案7】:

在我看来,最好/最简单的解决方案是构建一个小型 Flash 小部件,它由一个“上传”按钮和一个进度条组成。 Flash 为您提供了关于到目前为止已上传了多少数据的非常详细的反馈,您可以基于此构建一个不错的进度条。不需要对服务器进行低效的轮询,实际上根本不需要对服务器代码进行任何更改。谷歌搜索“flash uploader”,你会发现很多人已经编写了这些小部件,并且很乐意将它们卖给你。

【讨论】:

【参考方案8】:

我建议您查看SWFUpload 来完成您想要的。它相当灵活并支持文件排队,因此您甚至可以处理多文件上传。

【讨论】:

【参考方案9】:

你肯定想选择digitgerald's FancyUpload。它是基于 Mootools 和 swfuplaod 的,它具有一个很好的队列,包含状态、进度、eta 等。这确实是我见过的上传文件的最巧妙的方法。对于我的个人用例,ivé 使用它让客户选择 1.2 GB 的 PDF 文件并上传它们。较新的会自动重命名和版本化,相同的会被跳过,等等。

【讨论】:

以上是关于在 PHP 中创建文件进度条的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BootStrap 中创建一个与边缘有间距的进度条

在 Spark Azure Databricks 中创建自定义进度条指示器

android开发_LayerlistDrawable(层叠图片)在进度条中的应用

如何在Android中创建一个在其上旋转的圆形进度条?

如何在没有 Jquery-ui 且没有 Bootstrap 的情况下在 angularjs 中创建自定义进度条?

在 Qt 中创建旋转进度条