php实现上传文件夹
PHP 实现上传文件夹的方法
PHP 原生支持文件上传,但不直接支持文件夹上传。需要通过前端配合(如 JavaScript)将文件夹内容逐个上传,后端 PHP 处理多个文件。以下是实现步骤:
前端部分(HTML/JavaScript)
使用 <input type="file" webkitdirectory directory multiple> 允许用户选择文件夹,并通过 FormData 将文件逐个上传。
<input type="file" id="folderUpload" webkitdirectory directory multiple>
<button onclick="uploadFolder()">上传文件夹</button>
<script>
function uploadFolder() {
const files = document.getElementById('folderUpload').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
}).then(response => response.text())
.then(data => console.log(data));
}
</script>
后端部分(PHP)
在 upload.php 中处理上传的文件,并按原始文件夹结构保存。
<?php
if (!empty($_FILES['files'])) {
$uploadDir = 'uploads/'; // 根目录
foreach ($_FILES['files']['name'] as $i => $name) {
if ($_FILES['files']['error'][$i] !== UPLOAD_ERR_OK) {
continue;
}
// 获取前端传递的原始路径(如 "folder/subfolder/file.txt")
$relativePath = $_FILES['files']['name'][$i]; // 需前端正确传递
$targetPath = $uploadDir . dirname($relativePath);
// 创建子目录(如果不存在)
if (!file_exists($targetPath)) {
mkdir($targetPath, 0777, true);
}
// 移动文件到目标路径
move_uploaded_file(
$_FILES['files']['tmp_name'][$i],
$targetPath . '/' . basename($name)
);
}
echo "上传成功!";
}
?>
注意事项
- 路径处理:前端需通过
webkitRelativePath获取文件的相对路径(部分浏览器支持)。 - 大文件限制:修改
php.ini中的upload_max_filesize和post_max_size。 - 安全性:检查文件类型、重命名文件,避免目录遍历攻击。
- 兼容性:非所有浏览器支持文件夹上传(Chrome、Edge 支持较好)。
替代方案(ZIP 上传)
若浏览器不支持文件夹上传,可让用户压缩为 ZIP 文件,后端解压:
$zip = new ZipArchive;
if ($zip->open($_FILES['zip']['tmp_name']) === TRUE) {
$zip->extractTo('uploads/');
$zip->close();
echo "解压成功!";
}
通过上述方法可实现文件夹上传功能。







