PHP Ajax上传进度条

2024-04-18

<form enctype="multipart/form-data" action="upload.php" method="POST">
<input name="uploaded" type="file" />
<input type="submit" value="Upload" />
</form>

<?php
if(isset($_REQUEST['submit'])){
   $target = "data/".basename( $_FILES['uploaded']['name']) ;
   move_uploaded_file($_FILES['uploaded']['tmp_name'], $target);
}
?>

我非常了解 Javascript、AJAX 和 JQuery 等,并且我相信可以使用 PHP、AJAX 和 Javascript 等创建上传进度条。

我很惊讶如何在上传过程中获取上传文件的大小(意味着每一秒我都想知道,上传了多少文件以及剩余多少文件,我认为应该可以使用 AJAX 等)文件。

这是 PHP 手册的链接,但我不明白:http://php.net/manual/en/session.upload-progress.php http://php.net/manual/en/session.upload-progress.php

有没有其他方法可以使用 PHP 和 AJAX 显示上传进度条,但不使用任何 PHP 外部扩展?我无权访问php.ini


介绍

PHP 文档非常详细,它说

当上传正在进行时,以及当 POST 与 session.upload_progress.name INI 设置设置为相同名称的变量时,上传进度将在 $_SESSION 超全局中可用。当 PHP 检测到此类 POST 请求时,它将在 $_SESSION 中填充一个数组,其中索引是 session.upload_progress.prefix 和 session.upload_progress.name INI 选项的串联值。通常通过读取这些 INI 设置来检索密钥,即

您需要的所有信息都已在 PHP 会话命名中准备就绪

  • 开始时间
  • 内容长度
  • 已处理字节数
  • 文件信息(支持多个)

您所需要的只是提取此信息并将其显示在 HTML 表单中。

基本示例

a.html

<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css"
rel="stylesheet" type="text/css" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
<script type="text/javascript">
    var intval = null;
    var percentage = 0 ;
    function startMonitor() {
        $.getJSON('b.php',
        function (data) {
            if (data) {
                percentage = Math.round((data.bytes_processed / data.content_length) * 100);
                $("#progressbar").progressbar({value: percentage});
                $('#progress-txt').html('Uploading ' + percentage + '%');

            }
            if(!data || percentage == 100){
                $('#progress-txt').html('Complete');
                stopInterval();
            }
        });
    }

    function startInterval() {
        if (intval == null) {
            intval = window.setInterval(function () {startMonitor()}, 200)
        } else {
            stopInterval()
        }
    }

    function stopInterval() {
        if (intval != null) {
            window.clearInterval(intval)
            intval = null;
            $("#progressbar").hide();
            $('#progress-txt').html('Complete');
        }
    }

    startInterval();
</script>

b.php

session_start();
header('Content-type: application/json');
echo json_encode($_SESSION["upload_progress_upload"]);

PHP 会话上传进度示例

这是一个更好的优化版本PHP 会话上传进度 https://github.com/blueimp/jQuery-File-Upload/wiki/PHP-Session-Upload-Progress

JavaScript

$('#fileupload').bind('fileuploadsend', function (e, data) {
    // This feature is only useful for browsers which rely on the iframe transport:
    if (data.dataType.substr(0, 6) === 'iframe') {
        // Set PHP's session.upload_progress.name value:
        var progressObj = {
            name: 'PHP_SESSION_UPLOAD_PROGRESS',
            value: (new Date()).getTime()  // pseudo unique ID
        };
        data.formData.push(progressObj);
        // Start the progress polling:
        data.context.data('interval', setInterval(function () {
            $.get('progress.php', $.param([progressObj]), function (result) {
                // Trigger a fileupload progress event,
                // using the result as progress data:
                e = document.createEvent('Event');
                e.initEvent('progress', false, true);
                $.extend(e, result);
                $('#fileupload').data('fileupload')._onProgress(e, data);
            }, 'json');
        }, 1000)); // poll every second
    }
}).bind('fileuploadalways', function (e, data) {
    clearInterval(data.context.data('interval'));
});

进度.php

$s = $_SESSION['upload_progress_'.intval($_GET['PHP_SESSION_UPLOAD_PROGRESS'])];
$progress = array(
        'lengthComputable' => true,
        'loaded' => $s['bytes_processed'],
        'total' => $s['content_length']
);
echo json_encode($progress);

其他例子

  • 使用 PHP 和 JavaScript 跟踪上传进度 http://phpmaster.com/tracking-upload-progress-with-php-and-javascript/
  • PHP-5.4-上传进度示例 https://github.com/chemicaloliver/PHP-5.4-Upload-Progress-Example
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP Ajax上传进度条 的相关文章

  • jquery是如何实现$(document).ready()的?

    jquery是如何实现的 document ready 当然我可以阅读代码 但我正在寻找这个概念 概念 jQuery ready http api jquery com ready 虽然 JavaScript 提供了在渲染页面时执行代码的
  • 在 sendmultiple 上使用 dropzone.js 发送 formData

    dropzone js 文档 wiki 没有说明如何发送表单字段 我刚刚读到表单数据对象 https developer mozilla org en US docs Web API FormData FormData它说明了如何使用表单字
  • DOM 属性更改时触发事件

    有没有办法在属性更改时触发事件 可能是自定义的 比方说 当IMG src或DIV的innerHtml发生变化时 注意 自 2012 年起 突变事件已从标准中删除 现已弃用 有关如何使用其替代品 请参阅其他答案或文档 MutationObse
  • PHP 按值对数组进行分组

    我有一个像这样的数组 Array 0 gt ing 1 ing 1 gt ing 1 amount 2 gt ing 1 det 3 gt ing 1 meas 4 gt ing 2 ing 5 gt ing 2 amount 6 gt i
  • JavaScript 中检查变量是否为字符串

    JavaScript 中如何确定变量是字符串还是其他内容 这对我有用 if typeof myVar string myVar instanceof String it s a string else it s something else
  • FOSUser Bundle 必须配置路径“fos_user”的子节点“db_driver”

    我试图在安装 FOSUser Bundle 2 0 后更新学说架构 但我不断收到此错误 In ArrayNode php line 238 The child node db driver at path fos user must be
  • Fabric JS ClipPath:裁剪后如何使图像适合画布?

    我使用 FabricJS 和 ClipPath 属性实现了图像裁剪 问题是如何使裁剪后的图像适合画布 我希望裁剪后的图像填充画布区域 但不知道是否可以使用 Fabric js 来完成 因此 我希望用户单击 裁剪 按钮后图像的选定部分适合画布
  • 函数默认参数有些问题?

    看到这个 let foo outer function bar func x gt foo let foo inner console log func bar outer 我想知道为什么输出是 外部 而不是 内部 我知道 JavaScri
  • 在 Twitter Bootstrap 轮播中显示下一张和上一张图像

    我正在寻找一种在 Twitter Bootstrap 轮播中显示下一张和上一张幻灯片图像的方法 默认情况下 它只显示当前图像 如果我删除 display none css 属性 则轮播中的每个项目都在彼此下方 我尝试过使用 CSS 但还没有
  • Safari 不设置 cookie,但 Chrome 和 Firefox 会设置

    我正在将请求从本地主机发送到第三方服务器以使用 REST API 获取数据 后端使用cookies JSESSIONID 来了解是否发送数据 在 Chrome 中一切正常 我可以在 Chrome 浏览器的 应用程序 选项卡中看到 Cooki
  • 如何使用 toLocaleTimeString 12 小时时间而不使用 AM/PM 缩写?

    我想以 12 小时格式显示时间而不使用AM and PM 例如3 45仅且不3 45 PM or 3 45 AM 我该如何修改toLocaleTimeString 不显示PM AM但12位数字格式 var minsToAdd 45 var
  • 未捕获的引用错误:handleClick 未定义 - React

    我就直接进入正题吧 这是我在 ReactJS 应用程序中的组件 class BooksList extends Component constructor props super props this handleClick this ha
  • Javascript 函数无法返回元素

    所以我正在与手动表 http handsontable com 目前项目的 jQuery 插件 我已经编写了一些自定义函数来使用它 我目前遇到问题的函数是我编写的一个函数 用于返回当前选定的单元格 当用户仅选择一个而不是多个时 是的 已检查
  • 从扩展 pug/jade 模板将变量传递到基本布局

    我想通过在扩展基本布局的模板中声明变量来在 body 标记上设置一个类 当我尝试时 body class变量是undefined在布局中 看起来布局是在扩展模板之前执行的 或者它们是在不同的范围内执行的 还有别的办法吗 mixin 在这里可
  • jquery 克隆组合框无法运行

    我有下表 当我按下第一个按钮时 我调用 jquery 来克隆第一行并添加新行 table class table table striped table bordered bootstrap datatable style font siz
  • 按位置获取元素?

    我正在研究 SVG 脚本 有 getElementById 或 getElementsByTagName 但我找不到任何方法来按位置获取元素 比如获取位置为x 10 y 10的元素 有什么办法可以实现这个目标吗 var yourElemen
  • 如何从控制器 Symfony2 内部访问不同的控制器

    我需要从另一个控制器内的不同控制器访问方法 我该怎么做 我可以用吗this gt get method 我可以将控制器包含在当前控制器中并创建它的对象并通过该对象访问该方法吗 这样做 可以 吗 我想调用另一个控制器的表单方法 newActi
  • JavaScript 中二维数组的 forEach() 和 Apply() 方法

    我有一个数组 其元素也是数组 每个数组包含三个元素 我想打电话给function calcMe a b c 对于我的主数组的每个元素使用forEach 方法 但我真的很困惑 不知道如何让它发挥作用 arr 1 5 4 8 5 4 3 4 5
  • JavaFX ProgressBar:如何添加动画?

    我创建了一个进度条并更改了进度条颜色 是否可以像 bootstrap 动画进度条一样向进度条添加动画 这是示例 链接在这里 http getbootstrap com components progress animated 实际上 我找到
  • 预期的 catch() 或返回(promise/catch-or-return)

    我是 JavaScript 新手 这是我在 javascript 中第一个在 firebase 上部署函数的函数 得到这个错误 eslint Unexpected function expression prefer arrow callb

随机推荐