当前位置:首页 > PHP

php实现上传进度条

2026-02-27 16:50:37PHP

在PHP中实现文件上传进度条,可以通过结合前端技术和PHP的session.upload_progress机制来实现。以下是具体实现方法:

启用session.upload_progress

在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%"

前端HTML表单

创建一个包含文件上传字段和隐藏字段的表单,隐藏字段用于触发上传进度跟踪:

php实现上传进度条

<form action="upload.php" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="<?php echo ini_get('session.upload_progress.name'); ?>" value="123">
    <input type="file" name="file1">
    <input type="submit" value="Upload">
</form>
<div id="progress-container">
    <div id="progress-bar"></div>
</div>

后端PHP处理

创建upload.php处理文件上传,同时提供获取进度信息的接口:

<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 处理文件上传
    move_uploaded_file($_FILES['file1']['tmp_name'], '/path/to/uploads/' . $_FILES['file1']['name']);
}

进度查询接口

创建progress.php用于返回当前上传进度:

php实现上传进度条

<?php
session_start();
header('Content-Type: application/json');
$key = ini_get('session.upload_progress.prefix') . $_GET['key'];
if (!empty($_SESSION[$key])) {
    $progress = $_SESSION[$key];
    echo json_encode([
        'bytes_processed' => $progress['bytes_processed'],
        'content_length' => $progress['content_length'],
        'percent' => round(($progress['bytes_processed'] / $progress['content_length']) * 100, 2)
    ]);
} else {
    echo json_encode(['percent' => 0]);
}

前端JavaScript轮询

使用JavaScript定期查询上传进度并更新进度条:

function fetchProgress(key) {
    fetch(`progress.php?key=${key}`)
        .then(response => response.json())
        .then(data => {
            document.getElementById('progress-bar').style.width = data.percent + '%';
            if (data.percent < 100) {
                setTimeout(() => fetchProgress(key), 500);
            }
        });
}

document.querySelector('form').addEventListener('submit', function(e) {
    const key = this.elements['PHP_SESSION_UPLOAD_PROGRESS'].value;
    fetchProgress(key);
});

CSS样式

添加简单的CSS样式美化进度条:

#progress-container {
    width: 100%;
    background-color: #f0f0f0;
    margin-top: 10px;
}
#progress-bar {
    height: 20px;
    background-color: #4CAF50;
    width: 0%;
    transition: width 0.3s;
}

这种方法利用了PHP内置的上传进度跟踪功能,通过前端轮询后端接口获取实时进度数据,实现了无需额外扩展的上传进度条功能。

标签: 进度条上传
分享给朋友:

相关文章

vue 实现上传

vue 实现上传

Vue 实现文件上传的方法 在 Vue 中实现文件上传可以通过多种方式完成,以下是几种常见的方法: 使用原生 HTML 的 input 元素 通过 HTML 的 input 元素设置 type="f…

vue实现上传表格

vue实现上传表格

Vue实现上传表格的方法 使用Element UI上传组件 Element UI提供了el-upload组件,可以方便地实现文件上传功能。需要安装Element UI并引入相关组件。 安装Eleme…

js实现文件的上传

js实现文件的上传

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。HTML部分需要包含一个文件选择控件和一个提交按…

vue实现切片上传

vue实现切片上传

切片上传的实现原理 切片上传是将大文件分割成多个小块(切片)分别上传,最后在服务端合并。这种方式能提高上传效率、支持断点续传和并发上传。 前端实现步骤 使用Vue实现切片上传需要借助File…

vue实现音乐上传

vue实现音乐上传

Vue 实现音乐上传功能 音乐上传功能通常涉及前端界面交互、文件选择、上传进度显示以及后端接口对接。以下是基于 Vue 的实现方法: 前端界面设计 使用 Vue 的模板语法创建一个简单的上传界面,包…

vue用户实现头像上传

vue用户实现头像上传

前端实现头像上传(Vue + Element UI) 环境准备 确保项目已安装element-ui和axios(或其他HTTP库): npm install element-ui axios 组件代…