当前位置:首页 > PHP

php实现上传进度条

2026-04-03 01:35:13PHP

php实现上传进度条

PHP 实现上传进度条的方法

使用 session.upload_progress 特性

PHP 5.4+ 内置了文件上传进度跟踪功能,通过 session.upload_progress 实现。

php实现上传进度条

  1. php.ini 中启用配置:
    session.upload_progress.enabled = On
    session.upload_progress.cleanup = Off  # 调试时可关闭自动清理
  2. 前端表单需包含隐藏字段:
    <input type="hidden" name="<?php echo ini_get('session.upload_progress.name'); ?>" value="file_upload" />
  3. 后端通过 AJAX 轮询进度:
    session_start();
    $key = ini_get('session.upload_progress.prefix') . $_GET['progress_key'];
    $progress = $_SESSION[$key] ?? null;
    echo json_encode($progress);

使用 JavaScript + AJAX 轮询

  1. 前端通过 FormDataXMLHttpRequest 分块上传:
    let xhr = new XMLHttpRequest();
    xhr.upload.addEventListener('progress', (e) => {
      let percent = Math.round((e.loaded / e.total) * 100);
      document.getElementById('progress-bar').style.width = percent + '%';
    });
    xhr.open('POST', 'upload.php', true);
    xhr.send(formData);

使用第三方库(如 Dropzone.js)

Dropzone.js 提供现成的上传进度 UI:

<link rel="stylesheet" href="https://unpkg.com/dropzone@5/dist/dropzone.css" />
<script src="https://unpkg.com/dropzone@5/dist/dropzone.js"></script>

<form action="/upload" class="dropzone">
  <div class="dz-message">拖放文件到此处上传</div>
</form>

注意事项

  • 大文件需调整 php.iniupload_max_filesizepost_max_size
  • 进度信息存储在 $_SESSION 中,确保会话已启动。
  • 生产环境建议清理旧的进度数据以避免内存占用。

完整示例代码

// upload.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);
    echo 'Upload complete';
}
<!-- index.html -->
<div id="progress" style="width:100%;background:#ddd">
  <div id="progress-bar" style="height:20px;width:0%;background:#4CAF50"></div>
</div>

<script>
  document.querySelector('input[type="file"]').addEventListener('change', function(e) {
    let formData = new FormData();
    formData.append('file', e.target.files[0]);

    let xhr = new XMLHttpRequest();
    xhr.upload.onprogress = function(e) {
      if (e.lengthComputable) {
        let percent = (e.loaded / e.total) * 100;
        document.getElementById('progress-bar').style.width = percent + '%';
      }
    };
    xhr.open('POST', 'upload.php', true);
    xhr.send(formData);
  });
</script>

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

相关文章

vue实现上传

vue实现上传

Vue 实现文件上传 在 Vue 中实现文件上传功能可以通过原生 HTML5 的 <input type="file"> 元素结合 Vue 的数据绑定和事件处理来实现。以下是几种常见的实现…

vue实现头像上传

vue实现头像上传

Vue 头像上传实现方法 使用 <input type="file"> 基础方法 创建文件输入控件并监听 change 事件: <template> <div>…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…

js 实现进度条

js 实现进度条

使用 HTML 和 CSS 创建基础结构 进度条需要一个容器和一个填充元素。HTML 结构可以简单如下: <div class="progress-container"> <d…

vue实现附件上传

vue实现附件上传

文件上传的基本实现 在Vue中实现文件上传可以通过原生HTML的<input type="file">元素结合Vue的数据绑定和事件处理来完成。创建一个文件上传组件,监听change事件获…

vue怎么实现文档上传

vue怎么实现文档上传

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