php实现上传文件夹
在PHP中实现上传文件夹功能需要结合前端的多文件选择和后端的递归处理。以下是具体实现方法:
前端部分
使用HTML5的<input type="file">元素并添加webkitdirectory和directory属性以支持文件夹上传:
<input type="file" id="folderUpload" webkitdirectory directory multiple>
通过JavaScript获取文件夹结构并上传:
document.getElementById('folderUpload').addEventListener('change', function(e) {
const files = e.target.files;
const formData = new FormData();
for (let i = 0; i < files.length; i++) {
formData.append('files[]', files[i], files[i].webkitRelativePath);
}
fetch('upload.php', {
method: 'POST',
body: formData
});
});
后端处理
在PHP中接收并处理文件夹结构:
if (isset($_FILES['files'])) {
$uploadDir = __DIR__ . '/uploads/';
foreach ($_FILES['files']['name'] as $key => $name) {
$relativePath = $_FILES['files']['webkitRelativePath'][$key];
$fullPath = $uploadDir . dirname($relativePath);
if (!file_exists($fullPath)) {
mkdir($fullPath, 0777, true);
}
move_uploaded_file(
$_FILES['files']['tmp_name'][$key],
$fullPath . '/' . basename($name)
);
}
echo "文件夹上传成功";
}
注意事项
现代浏览器(Chrome、Edge、Firefox)支持文件夹上传,但Safari支持有限
上传大文件夹时需要设置PHP配置:
ini_set('upload_max_filesize', '1024M');
ini_set('post_max_size', '1024M');
ini_set('max_execution_time', '600');
安全性方面应添加文件类型验证:
$allowedTypes = ['image/jpeg', 'application/pdf'];
if (!in_array($_FILES['files']['type'][$key], $allowedTypes)) {
continue;
}
替代方案
对于不支持文件夹上传的浏览器,可以考虑使用第三方库如:

- Dropzone.js
- Fine Uploader
- Plupload
这些库提供更完整的文件夹上传解决方案,包括进度显示和错误处理功能。






