在 PHP 中,结合 Ajax 和 HTML5 的 File API
,可以实现带进度条的文件上传功能。以下是完整的实现代码和步骤:
1. 前端代码(HTML + JavaScript)
前端使用 FormData
和 XMLHttpRequest
实现文件上传,并通过 progress
事件更新进度条。
HTML 部分:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>文件上传带进度条</title> <style> #progress { width: 100%; background-color: #f3f3f3; border: 1px solid #ccc; margin-top: 10px; } #progress-bar { width: 0%; height: 30px; background-color: #4caf50; text-align: center; line-height: 30px; color: white; } </style></head><body> <h1>文件上传带进度条</h1> <form id="upload-form"> <input type="file" name="file" id="file" required> <button type="submit">上传</button> </form> <div id="progress"> <div id="progress-bar">0%</div> </div> <p id="status"></p> <script> document.getElementById('upload-form').addEventListener('submit', function (e) { e.preventDefault(); // 阻止表单默认提交行为 var fileInput = document.getElementById('file'); var file = fileInput.files[0]; var formData = new FormData(); formData.append('file', file); var xhr = new XMLHttpRequest(); // 监听上传进度 xhr.upload.addEventListener('progress', function (e) { if (e.lengthComputable) { var percent = (e.loaded / e.total) * 100; document.getElementById('progress-bar').style.width = percent + '%'; document.getElementById('progress-bar').innerText = Math.round(percent) + '%'; } }); // 监听上传完成 xhr.addEventListener('load', function () { document.getElementById('status').innerText = '上传完成!'; if (xhr.status === 200) { console.log('服务器响应:', xhr.responseText); } else { console.error('上传失败:', xhr.statusText); } }); // 监听上传错误 xhr.addEventListener('error', function () { document.getElementById('status').innerText = '上传出错!'; }); // 发送请求 xhr.open('POST', 'upload.php', true); xhr.send(formData); }); </script></body></html>
2. 后端代码(PHP)
PHP 接收上传的文件并保存到服务器。
upload.php
文件:
<?php// 检查是否有文件上传if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) { $uploadDir = 'uploads/'; // 上传文件保存目录 if (!is_dir($uploadDir)) { mkdir($uploadDir, 0755, true); // 如果目录不存在,则创建 } $fileName = basename($_FILES['file']['name']); // 获取文件名 $filePath = $uploadDir . $fileName; // 文件保存路径 // 移动文件到目标目录 if (move_uploaded_file($_FILES['file']['tmp_name'], $filePath)) { echo "文件上传成功!路径:$filePath"; } else { http_response_code(500); echo "文件上传失败!"; }} else { http_response_code(400); echo "无效的请求!";}?>
3. 运行流程
用户选择文件并点击“上传”按钮。
前端通过
FormData
和XMLHttpRequest
将文件发送到服务器。服务器接收文件并保存到指定目录。
前端通过
progress
事件更新上传进度条。
4. 代码说明
前端部分:
FormData:用于构建表单数据,支持文件上传。
XMLHttpRequest:用于发送异步请求,并监听上传进度。
progress 事件:实时更新上传进度条。
后端部分:
$_FILES:PHP 全局变量,用于获取上传的文件信息。
move_uploaded_file:将上传的文件移动到目标目录。
5. 示例效果
用户选择文件后,点击“上传”按钮。
页面显示上传进度条,实时更新上传进度。
上传完成后,显示上传结果(成功或失败)。
6. 注意事项
文件大小限制:
在 PHP 中,默认上传文件大小限制为
2MB
。可以通过修改php.ini
中的以下配置来调整:upload_max_filesize = 10Mpost_max_size = 10M
在前端也可以通过
<input type="file" accept=".jpg,.png" />
限制文件类型。安全性:
对上传的文件进行验证,确保文件类型和大小符合要求。
重命名上传的文件,避免文件名冲突或恶意文件上传。
目录权限:
确保上传目录(如
uploads/
)有写权限。
7. 完整代码结构
/project │ ├── index.html # 前端页面 ├── upload.php # 后端处理文件 └── uploads/ # 上传文件保存目录
通过以上代码,你可以实现一个带进度条的文件上传功能,适用于需要实时反馈上传进度的场景。
本文关键词: PHP+Ajax 异步 进度 上传 文件 实例
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。