有谁知道如何获取进度条以php上传?我正在尝试为相册上传者编写代码。我希望在上传照片时显示进度条。
我对php很陌生,所以我不了解它的一切。
有谁知道如何获取进度条以php上传?我正在尝试为相册上传者编写代码。我希望在上传照片时显示进度条。
我对php很陌生,所以我不了解它的一切。
Answers:
这是到目前为止(在经过数小时的搜索和尝试脚本之后)最简单的设置,也是我发现的最好的上载器
https://github.com/FineUploader/fine-uploader
它不需要APC或任何其他外部PHP库,我可以在共享主机上获得文件进度反馈,它声称支持html5拖放(未经个人测试)和多个文件上传。
很遗憾地说,就我所知,由于PHP的工作方式,纯PHP上传进度条,甚至PHP / Javascript上传进度条都是不可能的。最好的选择是使用某种形式的Flash上传器。
AFAIK这是因为直到所有超全局变量(包括$ _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);"
现在,您的表单中有一个隐藏的iframe,当您单击“提交”以开始上传文件时,该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>具有不同的颜色)。具有上载进度的iframe自然仅在上载过程中起作用,并且在提交表单并且浏览器重新加载到下一页后,其可见寿命就结束了。
上传进度条的实现很容易,不需要任何其他PHP扩展,JavaScript或Flash。但是您需要PHP 5.4及更高版本。
您必须通过将指令设置session.upload_progress.enabled
为On
in来启用收集上传进度信息php.ini
。
然后,在其他任何文件输入之前,将隐藏的输入添加到HTML上载表单。name
该隐藏输入的HTML属性应与session.upload_progress.name
from的指令值相同php.ini
(最终以开头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
超全局结构中创建一个新密钥,该密钥将填充有上传状态信息。键是串联的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
)
)
);
创建进度条需要所有的信息-如果上传仍在进行中,您将获得这些信息;总共将要传输多少字节以及已经传输了多少字节。
要将上传进度呈现给用户,请编写另一个PHP脚本而不是上传脚本,该脚本将仅查看会话中的上传信息并以JSON格式返回。可以使用AJAX和提供给用户的信息定期(例如每秒)调用此脚本。
您甚至可以通过将设置为$_SESSION[$key]['cancel_upload']
来取消上传true
。
有关详细信息,其他设置和用户注释,请参见PHP manual。
另一个完整的JS上传器:http : //developers.sirika.com/mfu/
玩得开心
Gears和HTML5在HttpRequest
对象中都有一个progress事件,用于通过AJAX提交文件上传。
http://developer.mozilla.org/en/Using_files_from_web_applications
别人已经回答的您的其他选择是:
从技术上讲,有类似YouTube上传的第四个选项,使用Gears或HTML5,您可以使用Blob将文件分成小块,然后分别上传每个块。完成每个块后,您可以更新进度状态。
您将需要使用Javascript创建进度条。一个简单的Google搜索使我想到了这篇文章:WebAppers CSS的Simple Javascript Progress Bar。
Dojo文件上载进度栏小部件是使用Dojo Javascript框架的另一个选项。
编辑:假设您上传了大量图像(例如相册),并将其发布到PHP脚本中,则可以使用javascript从帖子中读取结果,并根据上传的图像数更新进度条/图片总数。这具有仅在每个帖子完成后进行更新的副作用。在这里查看有关如何使用JS发布的一些信息。
可以完成一个php / ajax进度条。(在pear中检出Html_Ajax库)。但是,这需要将自定义模块安装到php中。
其他方法需要使用iframe,php会通过iframe查看已上传了多少文件。但是,此隐藏的iframe可能会被某些浏览器插件阻止,因为隐藏的iframe通常用于向用户计算机发送恶意数据。
如果您无法控制服务器,最好的选择是使用某种形式的Flash进度条。