php PHP上传进度条

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/849237/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 00:04:56  来源:igfitidea点击:

Upload Progress Bar in PHP

phpuploadprogress-bar

提问by Josh Curren

Does anyone know how to get a progress bar for an upload in php? I am trying writing code for a photo album uploader. I would like a progress bar to display while the photos are uploading.

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

I am fairly new to php so I dont know everything about it.

我对 php 还很陌生,所以我不知道它的一切。

采纳答案by Jesse

This is by far (after hours of googling and trying scripts) the simplest to set up and nicest uploader I've found

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

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

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

It doesn't require APC or any other external PHP libraries, I can get file progress feedback on a shared host, and it claims to support html5 drag and drop (personally untested) and multiple file uploads.

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

回答by Powerlord

If you have APCinstalled, it has a callback hook for upload progress.

如果你安装了APC,它有一个上传进度的回调钩子。

Rasmus Lerdorf (PHP's creator) has a sampleof this using YUI (oh, and here's the PHP source).

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

See the documentation here.

请参阅此处的文档

回答by Macha

I'm sorry to say that to the best of my knowledge a pure PHP upload progress bar, or even a PHP/Javascript upload progress bar is not possible because of how PHP works. Your best bet is to use some form of Flash uploader.

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

AFAIK This is because your script is not executed until all the superglobals are populated, which includes $_FILES. By the time your PHP script gets called, the file is fully uploaded.

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

EDIT: This is no longer true. It was in 2010.

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

回答by IvarsK

One PHP-ish (5.2+) & no-Flash way that worked nicely for me:

一种非常适合我的 PHP 式 (5.2+) 和无 Flash 方式:

First, see thispost explaining how to get "uploadprogress" extension up and running.

首先,请参阅这篇文章,解释如何启动和运行“uploadprogress”扩展。

Then, in the page containing the form that you are uploading file(s) from, create the following iframe:

然后,在包含您从中上传文件的表单的页面中,创建以下 iframe:

<iframe id="progress_iframe" src="" style="display:none;" scrolling="no" frameborder="0"></iframe>

Next, add this code to your "Submit" button:

接下来,将此代码添加到您的“提交”按钮:

onclick="function set() { f=document.getElementById('progress_iframe'); f.style.display='block'; f.src='uploadprogress.php?id=<?=$upload_id?>';} setTimeout(set);"

Now you have a hidden iframe in your form that will come visible and show contents of uploadprogress.php when you click "Submit" to start uploading files. $upload_id must be the same that you are using as the value of hidden field "UPLOAD_IDENTIFIER" in your form.

现在您的表单中有一个隐藏的 iframe,当您单击“提交”开始上传文件时,该 iframe 将可见并显示 uploadprogress.php 的内容。$upload_id 必须与您在表单中用作隐藏字段“UPLOAD_IDENTIFIER”的值相同。

The uploadprogress.php itself looks about like this (fix and adjust to your needs):

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>

Note that is self-refreshes every second. You can surely add some nice visual progress bar here (like 2 nested <div>s with different colors) if you like. The iframe with upload progress naturally only works while the upload is in progress, and ends its visible life once the form is submitted and browser reloads to the next page.

请注意,这是每秒自我刷新。如果您愿意,您当然可以在此处添加一些漂亮的视觉进度条(例如 2 个具有不同颜色的嵌套 <div> )。带有上传进度的 iframe 自然只在上传过程中起作用,并在提交表单和浏览器重新加载到下一页后结束其可见生命周期。

回答by David Ferenczy Rogo?an

Implementation of the upload progress bar is easy and doesn't require any additional PHP extension, JavaScript or Flash. But you need PHP 5.4 and newer.

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

You have to enable collecting of the upload progress information by setting the directive session.upload_progress.enabledto Onin php.ini.

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

Then add a hidden input to the HTML upload form just beforeany other file inputs. HTML attribute nameof that hidden input should be the same as the value of the directive session.upload_progress.namefrom php.ini(eventually preceded by session.upload_progress.prefix). The valueattribute is up to you, it will be used as part of the session key.

然后任何其他文件输入之前向 HTML 上传表单添加一个隐藏输入。name该隐藏输入的HTML 属性应与session.upload_progress.namefrom指令的值相同php.ini(最终以 开头session.upload_progress.prefix)。该value属性由您决定,它将用作会话密钥的一部分。

HTML form could looks like this:

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>

When you send this form, PHP should create a new key in the $_SESSIONsuperglobal structure which will be populated with the upload status information. The key is concatenated nameand valueof the hidden input.

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

In PHP you can take a look at populated upload information:

在 PHP 中,您可以查看填充的上传信息:

var_dump($_SESSION[
    ini_get('session.upload_progress.prefix')
   .ini_get('session.upload_progress.name')
   .'_myupload'
]);

The output will look similarly to the following:

输出将类似于以下内容:

$_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
    )
  )
);

There is all the information needed to create a progress bar — you have the information if the upload is still in progress, the information how many bytes is going to be transferred in total and how many bytes has been transferred already.

有创建进度条所需的所有信息 - 如果上传仍在进行中,您有信息,总共要传输多少字节以及已经传输多少字节的信息。

To present the upload progress to the user, write an another PHP script than the uploading one, which will only look at the upload information in the session and return it in the JSON format, for example. This script can be called periodically, for example every second, using AJAX and information presented to the user.

例如,要向用户展示上传进度,请编写一个不同于上传脚本的 PHP 脚本,该脚本只会查看会话中的上传信息并以 JSON 格式返回。可以使用 AJAX 和呈现给用户的信息定期调用此脚本,例如每秒调用一次。

You are even able to cancel the upload by setting the $_SESSION[$key]['cancel_upload']to true.

您甚至可以通过将 设置为$_SESSION[$key]['cancel_upload']来取消上传true

For detailed information, additional settings and user's comments see PHP manual.

有关详细信息、其他设置和用户评论,请参阅PHP 手册

回答by the master

HTML5 introduced a file upload apithat allows you to monitor the progress of file uploads but for older browsers there's pluploada framework that specifically made to monitor file uploads and give information about them. plus it has plenty of callbacks so it can work across all browsers

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

回答by Steve-o

Gears and HTML5 have a progress event in the HttpRequestobject for submitting a file upload via AJAX.

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

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

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

Your other options as already answered by others are:

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

  1. Flash based uploader.
  2. Java based uploader.
  3. A second comet-stylerequest to the web server or a script to report the size of data received. Some webservers like Lighttpd provide modules to do this in-process to save the overhead of calling an external script or process.
  1. 基于 Flash 的上传器。
  2. 基于 Java 的上传器。
  3. 对 Web 服务器或脚本的第二个彗星式请求,以报告接收到的数据的大小。Lighttpd 等一些网络服务器提供了在进程内执行此操作的模块,以节省调用外部脚本或进程的开销。

Technically there is a forth option, similar to YouTube upload, with Gears or HTML5 you can use blobs to split a file into small chunks and individually upload each chunk. On completion of each chunk you can update the progress status.

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

回答by Valdelievre

Another uploader full JS : http://developers.sirika.com/mfu/

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

  • Its free ( BSD licence )
  • Internationalizable
  • cross browser compliant
  • you have the choice to install APC or not ( underterminate progress bar VS determinate progress bar )
  • Customizable look as it uses dojo template mechanism. You can add your class / Ids in the te templates according to your css
  • 它是免费的(BSD 许可证)
  • 可国际化
  • 跨浏览器兼容
  • 您可以选择是否安装 APC(未终止进度条 VS 确定进度条)
  • 可定制的外观,因为它使用 dojo 模板机制。您可以根据您的 css 在 te 模板中添加您的类/ID

have fun

玩得开心

回答by Joey Robert

You would need to use Javascript to create a progress bar. A simple Google search led me to this article: WebAppers Simple Javascript Progress Bar with CSS.

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

Dojo File Upload Progress Bar Widgetis another option using the Dojo Javascript framework.

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

EDIT: Assuming your uploading a large number of images (such as a photo album), and POSTing them to your PHP script, you could use javascript to read the results back from the post and update the progress bar based on the number of images uploaded / total number of images. This has the side effect of only updating after each post has completed. Check out herefor some info on how to post with JS.

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

回答by Ali Lown

A php/ajax progress bar can be done. (Checkout the Html_Ajax library in pear). However this requires installing a custom module into php.

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

Other methods require using an iframe, through which php looks to see how much of the file has been uploaded. However this hidden iframe, may be blocked by some browsers addons because hidden iframes are often used to send malicious data to a users computer.

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

Your best bet is to use some form of flash progress bar if you do not have control over your server.

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