文件上传进度

最近在阅读PHP文档,看到session模块时,发现可以通过seession获取文件上传进度,于是动手实践了以下。目录结构

文档地址如下,文档还是要仔细看,我就不搬了:https://www.php.net/manual/zh/session.upload-progress.php

下面是我的demo,环境配置

配置文件php.ini

session.upload_progress.enabled = On
session.upload_progress.cleanup = On
session.upload_progress.prefix = "upload_progress_"
session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
session.upload_progress.freq =  "1%"
session.upload_progress.min_freq = "1"

配置文件nginx.conf
这是原文档的提示,这里这里卡了我好久!

fastcgi_request_buffering off;#这个很重要
环境说明:
	1、php8.1
	2、nginx 1.17.10
表单文件 index.php,form的target属性主要是控制上传完成后是否跳转页面,这里不跳转所有设定为内嵌的iframe的id
<form action="upload.php" method="POST" enctype="multipart/form-data" target="hidden_iframe">
 <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="test" />
 <input type="file" name="file1" />
 <input type="file" name="file2" />
 <input type="submit" value="upload"/>
</form>
<iframe id="hidden_iframe" name="hidden_iframe" src="about:blank" style="display:none;"></iframe>
<div>进度:<span id="progress"></span></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
function getProgress(){
    $.get('progress.php',{<?php echo ini_get("session.upload_progress.name"); ?>:"test"},function(res){
                $('#progress').text(res);
                if(res != 100)
                    setTimeout('getProgress()',100);
            })
}
$('form').submit(function(){
    setTimeout('getProgress()',100);
});
</script>
文件上传处理 upload.php

写的别叫简单

<?php
//var_dump($_FILES);
foreach ($_FILES as $file){
    move_uploaded_file($file['tmp_name'], 'files/'.time());
}
进度获取 progress.php
<?php
/**
 * AJAX获取上传文件进度
 */
session_start();
$i = ini_get('session.upload_progress.name');
//session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
$key = ini_get("session.upload_progress.prefix") . $_GET[$i];
//session.upload_progress.prefix = "upload_progress_" . 'test'
if (!empty($_SESSION[$key])) {
    $current = $_SESSION[$key]["bytes_processed"]; // 已收到的数据长度
    $total   = $_SESSION[$key]["content_length"];  // POST请求的总数据长度
    echo $current < $total ? ceil($current / $total * 100) : 100;
}else{
    echo 100;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值