当前位置: 首页 > 面试题库 >

PHP Ajax上传进度栏

卢翔宇
2023-03-14
问题内容
<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

是否有其他方法可以使用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会话命名中已准备好您需要的所有信息

  • 开始时间
  • content_length
  • bytes_processed
  • 文件信息(支持多个)

您需要提取的信息并以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 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'));
});

progress.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跟踪上传进度
  • PHP-5.4-上传进度示例


 类似资料:
  • 问题内容: 有谁知道如何获取进度条以php上传?我正在尝试为相册上传者编写代码。我希望在上传照片时显示进度条。 我对php很陌生,所以我不了解它的一切。 问题答案: 这是到目前为止(在经过数小时的搜索和尝试脚本之后)最简单的设置,也是我发现的最好的上载器 它不需要APC或任何其他外部PHP库,我可以在共享主机上获得文件进度反馈,它声称支持html5拖放(未经个人测试)和多个文件上传。

  • 问题内容: 看来我还没有清楚地传达出我的问题。我需要发送一个文件(使用AJAX),并且需要使用Nginx HttpUploadProgressModule 获取文件的上传进度。我需要一个很好的解决方案。我已经尝试过使用jquery.uploadprogress插件,但是我发现自己不得不重写其中的大部分内容,以使其在所有浏览器中都能正常工作并使用AJAX发送文件。 我所需要的只是执行此操作的代码,它

  • 问题内容: 我想显示使用servlet上传的上传进度栏。我尝试了iFrame技术Ajax。页面未重新加载,文件也被更新。但是,进度条没有到来。是否有可用于JavaServlts的jQuery进度插件? 谢谢!! 问题答案: 我强烈建议使用jQuery Uploadify 插件进行Ajax文件上传。它还带有进度条。您可以在其演示页面上找到示例。 与JSP /Servlet集成并不难。您基本上可以使“

  • 问题内容: 我需要为我的php上传网站创建进度栏的帮助。我已经整理了上传和摘录部分,但我需要进度条的帮助。我不确定该怎么做。另外,上传文件的最大大小是多少? 的HTML 的PHP 问题答案: 您可以进行一些更改以适合需要,但是如果您需要进度条,则效果会很好。您可以添加更多事件监听器,并根据需要进行设置。希望这对您来说是一个很好的起点。

  • 问题内容: 我敢肯定这已经被问过了,但是由于我似乎找不到一个好的答案,我在这里再次问…。:) 是否可以仅使用HTML,JavaScript / AJAX和PHP的组合来报告文件上载的实际进度? 回复任何提出SWFUpload或类似建议的人: 我都知道 走那条路。我正在寻找100%纯净的解决方案(是的,我知道我可能不会得到它)。 问题答案: 如果您能够将PECL软件包添加到PHP中,则有upload

  • 问题内容: 我正在努力寻找使用fetch实现上传进度指示器的文档或示例。 进度事件是一项高级功能,暂时无法获取。您可以通过查看标头并使用直通流来监视接收到的字节来创建自己的文件。 这意味着您可以显式地处理响应,而无需进行其他操作。当然,即使存在,也可能是谎言。使用流,您可以根据需要处理这些谎言。 我将如何编写发送的“用于监视字节的直通流”?如果有什么不同,我正在尝试执行此操作以增强从浏览器到Clo