当前位置:首页 > PHP

php实现上传文件夹

2026-01-29 07:02:40PHP

实现文件夹上传的基本思路

PHP原生不支持直接上传整个文件夹,但可以通过前端配合实现。核心思路是前端将文件夹内的文件逐个上传,后端接收并保持原有目录结构。

前端HTML部分

使用HTML5的webkitdirectory属性让input可以选择文件夹:

php实现上传文件夹

<input type="file" id="folderUpload" webkitdirectory directory multiple>

前端JavaScript处理

通过File API读取文件夹内容并构建FormData:

php实现上传文件夹

document.getElementById('folderUpload').addEventListener('change', function(e) {
    let files = e.target.files;
    let formData = new FormData();

    for (let i = 0; i < files.length; i++) {
        // 保留相对路径信息
        let relativePath = files[i].webkitRelativePath;
        formData.append('files[]', files[i], relativePath);
    }

    // 发送到服务器
    fetch('upload.php', {
        method: 'POST',
        body: formData
    });
});

PHP后端处理

接收文件并重建目录结构:

if (!empty($_FILES['files'])) {
    $basePath = 'uploads/';

    foreach ($_FILES['files']['name'] as $i => $name) {
        $tmpPath = $_FILES['files']['tmp_name'][$i];
        $relativePath = $_FILES['files']['name'][$i]; // 包含路径的文件名

        // 创建完整目录路径
        $fullPath = $basePath . dirname($relativePath);
        if (!file_exists($fullPath)) {
            mkdir($fullPath, 0777, true);
        }

        // 移动文件
        move_uploaded_file($tmpPath, $basePath . $relativePath);
    }

    echo "文件夹上传完成";
}

注意事项

  • 确保服务器上的uploads目录有写入权限
  • 大文件上传需要调整php.ini中的upload_max_filesize和post_max_size
  • 考虑添加文件类型限制和安全检查
  • 对于大量文件建议分批次上传

替代方案

对于更复杂的场景,可以考虑使用现成的库:

  • Dropzone.js 前端库
  • Plupload 多文件上传解决方案
  • WebSocket实现实时进度显示

这种方法虽然需要前端配合,但能有效实现文件夹上传功能,并保持原始目录结构。

标签: 文件夹上传
分享给朋友:

相关文章

vue 实现上传

vue 实现上传

Vue 实现文件上传 使用 Vue 实现文件上传可以通过原生 HTML 的 <input type="file"> 或第三方库(如 axios、vue-upload-component)完…

php 实现上传视频

php 实现上传视频

上传视频的基本流程 在PHP中实现视频上传功能需要处理文件接收、验证、存储等步骤。核心是通过$_FILES超全局变量获取上传的文件信息,结合move_uploaded_file函数完成存储。 创建H…

js实现文件的上传

js实现文件的上传

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。HTML部分需要包含一个文件选择控件和一个提交按…

vue实现上传视频

vue实现上传视频

使用 <input type="file"> 实现基础上传 通过 HTML 原生文件选择控件获取视频文件,结合 Vue 处理上传逻辑。 <template> <…

vue实现拖拽上传

vue实现拖拽上传

Vue 拖拽上传实现方法 使用 HTML5 原生拖拽 API 在 Vue 中可以通过监听原生拖拽事件实现基础功能: <template> <div class="dr…

vue实现语音上传

vue实现语音上传

实现语音上传功能 在Vue中实现语音上传功能需要结合浏览器的Web Audio API和文件上传逻辑。以下是一个完整的实现方案: 录音功能实现 安装依赖库recorder-core和wav编码器:…