有谁知道如何在php中获取上传进度条?我正在编写照片相册上传器的代码,希望在照片上传时显示进度条。
我对php还比较陌生,不了解所有相关内容。
有谁知道如何在php中获取上传进度条?我正在编写照片相册上传器的代码,希望在照片上传时显示进度条。
我对php还比较陌生,不了解所有相关内容。
经过数小时的谷歌搜索和尝试脚本后,这是目前我找到最简单、最好用的上传工具。
https://github.com/FineUploader/fine-uploader
它不需要APC或其他外部PHP库,在共享主机上也可以获得文件上传进度反馈,并声称支持HTML5拖放(个人未经测试)和多文件上传。
很抱歉,据我所知,由于PHP的工作原理,纯PHP上传进度条甚至PHP/Javascript上传进度条都不可能实现。你最好使用某种形式的Flash上传工具。
这是因为你的脚本在超全局变量(包括$_FILES)被填充之前不会被执行。当你的PHP脚本被调用时,文件已经完全上传。
编辑:这已经不再是真的了。这是在2010年时的情况。
以下是一种适用于 PHP(5.2+)且不需要 Flash 的方法,我觉得非常好用:
首先,请参考这篇文章,了解如何启用“uploadprogress”扩展。
然后,在包含上传文件表单的页面中,创建以下的 iframe:
<iframe id="progress_iframe" src="" style="display:none;" scrolling="no" frameborder="0"></iframe>
然后,将此代码添加到您的“提交”按钮中:
onclick="function set() { f=document.getElementById('progress_iframe'); f.style.display='block'; f.src='uploadprogress.php?id=<?=$upload_id?>';} setTimeout(set);"
<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>
实现上传进度条很容易,不需要任何额外的PHP扩展、JavaScript或Flash。但是需要PHP 5.4及更高版本。
您需要通过在php.ini
中将指令session.upload_progress.enabled
设置为On
来启用收集上传进度信息。
然后,在任何其他文件输入之前,只需向HTML上传表单添加一个隐藏输入即可。该隐藏输入的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>
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
)
)
);
$_SESSION[$key]['cancel_upload']
设置为true
来取消上传。玩得开心!
HttpRequest
对象中有一个进度事件。
http://developer.mozilla.org/en/Using_files_from_web_applications
您的其他选择,就像其他人已经回答的一样,包括:从技术上讲,还有第四种选择,类似于YouTube上传,在使用Gears或HTML5时,可以使用Blob将文件分成小块,并逐个上传每个块。完成每个块后,您可以更新进度状态。
您需要使用JavaScript来创建进度条。一个简单的谷歌搜索让我找到了这篇文章:WebAppers Simple Javascript Progress Bar with CSS。
Dojo File Upload Progress Bar Widget是另一种使用Dojo JavaScript框架的选择。
编辑:假设您正在上传大量图像(例如照片相册),并将它们POST到您的PHP脚本中,您可以使用JavaScript从POST中读取结果,并根据已上传的图像数量/总图像数量更新进度条。这会导致每个POST完成后才更新。请查看此处以获取有关如何使用JS进行POST的一些信息。
可以使用php/ajax进度条(请查看pear中的Html_Ajax库)来实现。但是这需要将一个自定义模块安装到php中。
其他方法需要使用iframe,通过它php可以查看文件上传了多少。然而,一些浏览器插件可能会阻止这个隐藏的iframe,因为隐藏的iframes经常用于向用户计算机发送恶意数据。
如果您无法控制服务器,则最好使用某种形式的flash进度条。