用PHP上传进度条

用PHP上传进度条,php,upload,progress-bar,Php,Upload,Progress Bar,有人知道如何在php中获取上传进度条吗?我正在尝试为相册上传程序编写代码。我想在上传照片时显示进度条 我对php相当陌生,所以我不知道它的一切 很抱歉,就我所知,由于PHP的工作方式,纯PHP上传进度条,甚至PHP/Javascript上传进度条都不可能实现。你最好的选择是使用某种形式的Flash上传程序 这是因为在填充所有超全局变量(包括$\u文件)之前不会执行脚本。在调用PHP脚本时,文件已完全上载 编辑:这不再是事实。那是在2010年。您需要使用Javascript创建进度条。通过简单的谷

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


我对php相当陌生,所以我不知道它的一切

很抱歉,就我所知,由于PHP的工作方式,纯PHP上传进度条,甚至PHP/Javascript上传进度条都不可能实现。你最好的选择是使用某种形式的Flash上传程序

这是因为在填充所有超全局变量(包括$\u文件)之前不会执行脚本。在调用PHP脚本时,文件已完全上载


编辑:这不再是事实。那是在2010年。

您需要使用Javascript创建进度条。通过简单的谷歌搜索,我找到了这篇文章:

是使用DojoJavaScript框架的另一个选项


编辑:假设您上载了大量图像(如相册),并将其发布到PHP脚本中,您可以使用javascript从帖子中读取结果,并根据上载的图像数/图像总数更新进度栏。这样做的副作用是,只有在每个帖子完成后才进行更新。查看一些关于如何使用JS发布的信息。

可以创建一个php/ajax进度条。(在pear中签出Html_Ajax库)。 但是,这需要在php中安装自定义模块

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

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

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

Rasmus Lerdorf(PHP的创建者)使用YUI对这一点有一定的了解(哦,下面是示例)


请参阅。

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

其他人已经回答的其他选项包括:

  • 基于Flash的上传程序
  • 基于Java的上传程序
  • 对web服务器或脚本的第二个请求,用于报告所接收数据的大小。一些Web服务器(如Lighttpd)提供了在进程中执行此操作的模块,以节省调用外部脚本或进程的开销

  • 从技术上讲,有第四种选择,类似于YouTube上传,通过Gears或HTML5,您可以使用blob将文件分割成小块,然后分别上传每个块。完成每个区块后,您可以更新进度状态。

    另一个上载程序full JS:

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

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

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

    一个PHP ish(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=';}setTimeout(set);”
    
    现在,您的表单中有一个隐藏的iframe,当您单击“提交”开始上传文件时,它将显示uploadprogress.php的内容$upload_id必须与用作表单中隐藏字段“upload_IDENTIFIER”值的id相同

    uploadprogress.php本身如下所示(根据您的需要进行修复和调整):

    
    

    请注意,这是每秒钟进行一次自我刷新。如果你喜欢的话,你可以在这里添加一些漂亮的视觉进度条(比如两个不同颜色的嵌套进度条)。具有上载进度的iframe自然仅在上载过程中工作,一旦提交表单并将浏览器重新加载到下一页,它的可见生命就结束了。

    HTML5引入了一个框架,允许您监控文件上传的进度,但对于较旧的浏览器,有一个专门用于监控文件上传并提供相关信息的框架。此外,它还具有大量回调功能,因此可以跨所有浏览器运行

    上传进度条的实现非常简单,不需要任何额外的PHP扩展、JavaScript或Flash。但是您需要PHP5.4和更新的

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

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

    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>
    
    输出将类似于以下内容:

    $_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
        )
      )
    );
    
    $\u会话[“上载进度\u我的上载”]=array(
    “开始时间”=>1234567890,//请求时间
    “内容长度”=>57343257,//发布内容长度
    “bytes_processed”=>54321,//接收和处理的字节数
    “完成”=>错误//
    
    <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
        )
      )
    );