用PHP上传进度条
有谁知道如何获得一个进度条上传在PHP? 我正在尝试编写相册上传器的代码。 我想要在进行照片上传时显示进度条。
我相当新的PHP,所以我不知道这一切。
这是迄今为止(经过数小时的谷歌search和尝试脚本)最简单的设置和最好的上传我find
https://github.com/FineUploader/fine-uploader
它不需要APC或任何其他外部PHP库,我可以在共享主机上获得文件进度反馈,并声称支持html5拖放(未经testing)和多个file upload。
我很抱歉地说,据我所知,纯粹的PHP上传进度条,甚至PHP / Javascript上传进度条都不可能,因为PHP的工作原理。 你最好的select是使用某种forms的Flash上传器。
AFAIK这是因为你的脚本不会被执行,直到所有超级全局variables填充,其中包括$ _FILES。 当你的PHP脚本被调用的时候,文件已经完全上传了。
编辑:这不再是事实。 那是在2010年。
如果您安装了APC ,则会有上传进度的callback挂钩。
Rasmus Lerdorf(PHP的创build者)有一个使用YUI的例子 (哦,这里是PHP源代码 )。
请参阅这里的文档 。
一个PHP的ISH(5.2 +)和无Flash的方式,很好地为我工作:
首先,看到这个post解释如何获得“uploadprogress”扩展和运行。
然后,在包含要上传文件的表单的页面中,创build以下iframe:
<iframe id="progress_iframe" src="" style="display:none;" scrolling="no" frameborder="0"></iframe>
接下来,将此代码添加到您的“提交”button:
onclick="function set() { f=document.getElementById('progress_iframe'); f.style.display='block'; f.src='uploadprogress.php?id=<?=$upload_id?>';} setTimeout(set);"
现在,您的表单中会隐藏一个iframe,当您点击“Submit”开始上传文件时,iframe会显示并显示uploadprogress.php的内容。 $ upload_id必须与您在表单中隐藏字段“UPLOAD_IDENTIFIER”的值相同。
uploadprogress.php本身看起来像这样(修复和调整您的需要):
<html> <head> <META HTTP-EQUIV='REFRESH' CONTENT='1;URL=?id=<?=$_GET['id']?>'> </head> <body> Upload progress:<br /> <?php if(!$_GET['id']) die; $info = uploadprogress_get_info($_GET['id']); $kbytes_total = round($info['bytes_total'] / 1024); $kbytes_uploaded = round($info['bytes_uploaded'] / 1024); echo $kbytes_uploaded.'/'.$kbytes_total.' KB'; ?> </body> </html>
请注意,每秒钟都会自我刷新。 你可以肯定地在这里添加一些漂亮的视觉进度条(如2嵌套<div> s用不同的颜色),如果你喜欢。 带有上传进度的iframe自然只在上传过程中起作用,并且一旦表单被提交并且浏览器重新加载到下一页,就结束它的可见生活。
上传进度条的实现很简单,不需要任何额外的PHP扩展,JavaScript或Flash。 但是你需要PHP 5.4和更新的 。
您必须通过在php.ini
中将指令session.upload_progress.enabled
设置为On
来启用收集上载进度信息。
然后在任何其他文件input之前向HTML上载表单添加一个隐藏的input。 该隐藏input的HTML属性name
应该与php.ini
中的指令session.upload_progress.name
的值相同(最终由session.upload_progress.prefix
)。 value
属性取决于你,它将被用作会话密钥的一部分。
HTML表单可能如下所示:
<form action="upload.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="<?php echo ini_get('session.upload_progress.prefix').ini_get('session.upload_progress.name'); ?>" value="myupload" /> <input type="file" name="file1" /> <input type="submit" /> </form>
当你发送这个表单时,PHP应该在$_SESSION
超全局结构中创build一个新的关键字,这个关键字将填充上传状态信息。 键是隐藏input的连接name
和value
。
在PHP中,您可以查看已填充的上载信息:
var_dump($_SESSION[ ini_get('session.upload_progress.prefix') .ini_get('session.upload_progress.name') .'_myupload' ]);
输出将看起来类似于以下内容:
$_SESSION["upload_progress_myupload"] = array( "start_time" => 1234567890, // The request time "content_length" => 57343257, // POST content length "bytes_processed" => 54321, // Amount of bytes received and processed "done" => false, // true when the POST handler has finished, successfully or not "files" => array( 0 => array( "field_name" => "file1", // Name of the <input /> field // The following 3 elements equals those in $_FILES "name" => "filename.ext", "tmp_name" => "/tmp/phpxxxxxx", "error" => 0, "done" => false, // True when the POST handler has finished handling this file "start_time" => 1234567890, // When this file has started to be processed "bytes_processed" => 54321, // Number of bytes received and processed for this file ) ) );
有创build进度条所需的所有信息 – 如果上传仍在进行中,您将获得信息,信息将总共传输多less字节,以及已经传输了多less字节。
为了向用户呈现上传进度,编写另一个PHP脚本,而不是上传的脚本,例如只会查看会话中的上传信息并以JSON格式返回。 这个脚本可以定期调用,例如每秒钟使用AJAX和呈现给用户的信息。
您甚至可以通过将$_SESSION[$key]['cancel_upload']
为true
来取消上载。
有关详细信息,其他设置和用户的评论请参阅PHP手册 。
我刚刚find了使用perl进行上传并显示进度条的Mega Upload( http://www.raditha.com/php/progress.php )。
另一个上传完整的JS: http : //developers.sirika.com/mfu/
- 它的免费(BSD许可证)
- 可国际
- 跨浏览器兼容
- 您可以select是否安装APC(进度条VS确定进度条)
- 因为它使用dojo模板机制可自定义的外观。 你可以根据你的CSS添加你的类/ ID在TE模板中
玩的开心
HTML5引入了一个file uploadAPI ,允许你监视file upload的进度,但是对于旧版本的浏览器,可以加载一个专门用来监视file upload的框架,并提供关于它们的信息。 再加上它有很多的callback,所以它可以在所有的浏览器上工作
Gears和HTML5在HttpRequest
对象中有一个进度事件,用于通过AJAX提交file upload。
http://developer.mozilla.org/en/Using_files_from_web_applications
其他选项已经被其他人回答了:
- 基于Flash的上传器。
- 基于Java的上传器。
- 向Web服务器或脚本发送第二个慧星式请求,以报告收到的数据的大小。 像Lighttpd这样的一些Web服务器提供模块来进行这个过程,以节省调用外部脚本或进程的开销。
从技术上来说,第四种select,类似于YouTube上传,使用Gears或HTML5,您可以使用blob将文件拆分成小块,并单独上传每个块。 完成每个块后,您可以更新进度状态。
你将需要使用Javascript来创build一个进度条。 一个简单的Googlesearch引导我到这篇文章: WebAppers简单的Javascript进度条与CSS 。
Dojofile uploadProgress Bar Widget是使用Dojo Javascript框架的另一种select。
编辑:假设你上传大量的图像(如相册),并张贴到您的PHP脚本,您可以使用JavaScript从post中读回结果,并根据上传的图片数量更新进度栏/图像总数。 这只会在每个post完成后才会更新。 在这里查看一些关于如何发布JS的信息。
一个php / ajax进度条可以完成。 (检出梨中的Html_Ajax库)。 但是这需要在php中安装一个自定义模块。
其他方法需要使用iframe,通过php来查看上传了多less文件。 然而,这个隐藏的iframe,可能会被一些浏览器插件阻止,因为隐藏的iframe经常被用来向用户计算机发送恶意数据。
你最好的select是使用某种forms的Flash进度条,如果你没有控制你的服务器。
Flash上传将完成这项工作。 它会上传你想要的文件。 但是对我来说有更多的要求。 我需要在上传完成之前更改文件名。 这也是可能的闪存解决scheme,但只有当你添加固定variables。 我需要添加用户名到一个文件名,我看不到做到这一点。