用PHP上传进度条

时间:2009-05-11 17:51:24

标签: php upload progress-bar

有谁知道如何在php中上传进度条?我正在尝试为相册上传器编写代码。我希望在上传照片时显示进度条。

我对php很新,所以我不知道它的一切。

12 个答案:

答案 0 :(得分:70)

这是到目前为止(经过数小时的谷歌搜索和尝试脚本)最简单的设置和最好的上传我发现

https://github.com/FineUploader/fine-uploader

它不需要APC或任何其他外部PHP库,我可以在共享主机上获得文件进度反馈,并声称支持html5拖放(个人未经测试)和多个文件上传。

答案 1 :(得分:13)

我很遗憾地说,据我所知,纯PHP上传进度条,甚至是PHP / Javascript上传进度条都是不可能的,因为PHP的工作原理。最好的办法是使用某种形式的Flash上​​传器。

AFAIK这是因为在填充所有超全局(包括$ _FILES)之前,不会执行您的脚本。当您的PHP脚本被调用时,该文件已完全上传。

编辑:这不再是真的。那是在2010年。

答案 2 :(得分:13)

如果安装了APC,则会有一个用于上传进度的回调挂钩。

Rasmus Lerdorf(PHP的创建者)使用YUI有sample这个(哦,这里是PHP source)。

请参阅the documentation here

答案 3 :(得分:8)

一个PHP-ish(5.2 +)& no-Flash方式对我很有用:

首先,请参阅this帖子,了解如何启动并运行“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个嵌套的&lt; div&gt; s,用不同的颜色),如果你愿意的话。具有上传进度的iframe自然只在上传过程中有效,并在表单提交并浏览器重新加载到下一页后结束其可见生命。

答案 4 :(得分:3)

上传进度条的实现很简单,不需要任何额外的PHP扩展,JavaScript或Flash。但是你需要PHP 5.4及更新版

您必须通过在On中将指令session.upload_progress.enabled设置为php.ini来启用收集上传进度信息。

然后在 任何其他文件输入之前,向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>

当您发送此表单时,PHP应在$_SESSION超全局结构中创建一个新密钥,该结构将填充上载状态信息。密钥是隐藏输入的namevalue的连接。

在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

答案 5 :(得分:2)

我刚发现使用perl的Mega Upload(http://www.raditha.com/php/progress.php)进行上传并显示进度条。

答案 6 :(得分:2)

Gears和HTML5在HttpRequest对象中有一个进度事件,用于通过AJAX提交文件上传。

http://developer.mozilla.org/en/Using_files_from_web_applications

其他人已经回答的其他选择是:

  1. 基于Flash的上传器。
  2. 基于Java的上传器。
  3. 向Web服务器发送第二个comet-style请求或报告接收数据大小的脚本。像Lighttpd这样的一些Web服务器提供了在进程中执行此操作的模块,以节省调用外部脚本或进程的开销。
  4. 从技术上讲,有一个类似于YouTube上传的第四个选项,使用Gears或HTML5,您可以使用blob将文件拆分为小块并单独上传每个块。完成每个块后,您可以更新进度状态。

答案 7 :(得分:2)

另一个上传者JS:http://developers.sirika.com/mfu/

  • 免费(BSD许可证)
  • 可国际化
  • 符合浏览器标准
  • 您可以选择是否安装APC(确定进度条VS确定进度条)
  • 可自定义外观,因为它使用dojo模板机制。您可以根据您的css
  • 在te模板中添加您的班级/ ID

玩得开心

答案 8 :(得分:2)

HTML5引入了file upload api,允许您监控文件上传的进度,但对于旧浏览器,plupload是一个专门用于监控文件上传并提供相关信息的框架。加上它有很多回调,所以它可以在所有浏览器上工作

答案 9 :(得分:1)

您需要使用Javascript来创建进度条。一个简单的谷歌搜索引导我阅读这篇文章:WebAppers Simple Javascript Progress Bar with CSS

Dojo File Upload Progress Bar Widget是使用Dojo Javascript框架的另一种选择。

编辑:假设您上传了大量图片(例如相册),并将它们发布到您的PHP脚本,您可以使用javascript从帖子中读取结果并根据数字更新进度条上传的图片数/图片总数。这具有仅在每个帖子完成后更新的副作用。查看here以获取有关如何使用JS发布的一些信息。

答案 10 :(得分:1)

可以完成php / ajax进度条。 (查看梨中的Html_Ajax库)。 但是,这需要在php中安装自定义模块。

其他方法需要使用iframe,php通过它查看已上载了多少文件。但是,这个隐藏的iframe可能被某些浏览器插件阻止,因为隐藏的iframe通常用于向用户计算机发送恶意数据。

如果您无法控制服务器,最好使用某种形式的Flash进度条。

答案 11 :(得分:0)

flash上​​传将完成这项工作。它会将文件上传到您想要的位置。但是对我来说有更多的要求。我需要在上传完成之前更改文件名。如果您要添加FIXED变量,这也可以使用闪存解决方案。我需要将用户ID添加到文件名中,我认为没办法。