82

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

我对 php 相当陌生,所以我对它一无所知。

4

10 回答 10

70

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

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

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

于 2010-10-16T23:06:22.163 回答
13

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

Rasmus Lerdorf(PHP 的创建者)有一个使用 YUI 的示例(哦,这里是PHP 源代码)。

请参阅此处的文档

于 2010-01-21T18:44:17.227 回答
12

我很抱歉地说,据我所知,由于 PHP 的工作方式,纯 PHP 上传进度条,甚至是 PHP/Javascript 上传进度条是不可能的。您最好的选择是使用某种形式的 Flash 上传器。

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

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

于 2009-05-11T17:54:02.407 回答
8

一种对我很有效的 PHP-ish (5.2+) & no-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,当您单击“提交”开始上传文件时,它会显示并显示 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 自然只在上传过程中工作,一旦提交表单并且浏览器重新加载到下一页,它的可见生命就结束了。

于 2010-11-13T14:53:22.250 回答
4

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

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

然后在任何其他文件输入之前向 HTML 上传表单添加隐藏输入。该隐藏输入的HTML 属性name应与session.upload_progress.namefrom指令的值相同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 手册

于 2013-11-20T13:29:24.003 回答
2

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

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

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

  1. 基于 Flash 的上传器。
  2. 基于 Java 的上传器。
  3. 对 Web 服务器的第二个彗星式请求或报告接收数据大小的脚本。一些像 Lighttpd 这样的网络服务器提供了在进程内执行此操作的模块,以节省调用外部脚本或进程的开销。

从技术上讲,还有第四个选项,类似于 YouTube 上传,使用 Gears 或 HTML5,您可以使用 blob 将文件拆分为小块并单独上传每个块。完成每个块后,您可以更新进度状态。

于 2010-03-10T13:16:03.973 回答
2

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

  • 它是免费的(BSD许可证)
  • 国际化
  • 跨浏览器兼容
  • 您可以选择是否安装 APC(underterminate 进度条 VS 确定进度条)
  • 可定制的外观,因为它使用了 dojo 模板机制。您可以根据您的 css 在 te 模板中添加您的类/ID

玩得开心

于 2010-05-14T07:18:59.033 回答
2

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

于 2011-03-24T22:05:13.673 回答
1

您需要使用 Javascript 来创建进度条。一个简单的 Google 搜索让我看到了这篇文章:WebAppers Simple Javascript Progress Bar with CSS

Dojo 文件上传进度条小部件是使用 Dojo Javascript 框架的另一个选项。

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

于 2009-05-11T17:56:33.743 回答
1

可以做一个php/ajax进度条。(查看 pear 中的 Html_Ajax 库)。但是,这需要将自定义模块安装到 php.ini 中。

其他方法需要使用 iframe,php 通过 iframe 查看已上传的文件量。然而,这种隐藏的 iframe 可能会被某些浏览器插件阻止,因为隐藏的 iframe 通常用于向用户计算机发送恶意数据。

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

于 2009-05-11T18:06:41.683 回答