当前位置:首页 > 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表单

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

<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
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内置的上传进度跟踪功能,通过前端轮询后端接口获取实时进度数据,实现了无需额外扩展的上传进度条功能。

php实现上传进度条

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

相关文章

css制作网格进度条

css制作网格进度条

使用 CSS Grid 制作网格进度条 CSS Grid 是一种强大的布局工具,可以用来创建网格进度条。以下是实现方法: HTML 结构 <div class="progress-grid"…

vue实现文档上传

vue实现文档上传

Vue 实现文档上传的方法 使用原生 HTML 表单和 Vue 处理文件上传 在 Vue 中可以通过原生 HTML 的 <input type="file"> 元素结合 Vue 的数据绑定…

vue 怎么实现上传

vue 怎么实现上传

Vue 实现文件上传的方法 使用原生 HTML5 文件上传 通过 <input type="file"> 元素结合 Vue 的数据绑定实现基础文件上传功能。 <template&g…

jquery 进度条

jquery 进度条

jQuery 进度条实现方法 使用 jQuery 可以轻松创建和管理进度条,以下是几种常见的实现方式: 使用 HTML5 <progress> 元素 jQuery 可以操作 HTML5…

vue实现上传封面

vue实现上传封面

Vue 实现上传封面功能 使用原生 input 文件上传 在 Vue 中可以通过原生 HTML 的 input 元素实现文件上传功能。创建一个文件输入框,监听 change 事件获取用户选择的文件。…

vue怎么实现文档上传

vue怎么实现文档上传

文件上传的基本实现 在Vue中实现文件上传通常需要使用HTML的<input type="file">元素,结合Vue的数据绑定和事件处理。以下是一个基础实现示例: <templa…