
在 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/ # 上传文件保存目录
通过以上代码,你可以实现一个带进度条的文件上传功能,适用于需要实时反馈上传进度的场景。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。


