当前位置:首页 > PHP

php实现上传文件夹

2026-02-14 05:11:02PHP

上传文件夹的基本原理

PHP本身不支持直接上传整个文件夹,但可以通过前端选择文件夹后,将文件夹内的文件逐个上传。核心思路是使用HTML5的<input type="file" webkitdirectory>属性允许选择文件夹,再通过PHP逐个处理上传的文件。

前端实现方法

创建包含文件夹选择功能的HTML表单:

<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="files[]" webkitdirectory directory multiple>
    <input type="submit" value="上传文件夹">
</form>

webkitdirectorydirectory属性让浏览器允许选择文件夹,multiple属性允许选择多个文件,files[]表示接收文件数组。

后端PHP处理

upload.php中处理上传的文件:

php实现上传文件夹

if(isset($_FILES['files'])){
    $uploadDir = 'uploads/';

    foreach($_FILES['files']['name'] as $key => $name){
        $tmpName = $_FILES['files']['tmp_name'][$key];
        $error = $_FILES['files']['error'][$key];

        if($error === UPLOAD_ERR_OK){
            $targetPath = $uploadDir . $name;
            move_uploaded_file($tmpName, $targetPath);
        }
    }

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

保持目录结构

如果需要保留原始文件夹结构,可以从前端获取相对路径信息:

// 前端JavaScript获取文件相对路径
document.querySelector('input[type=file]').addEventListener('change', function(e){
    for(let file of e.target.files){
        console.log(file.webkitRelativePath);
    }
});

修改PHP代码处理路径:

foreach($_FILES['files']['name'] as $key => $name){
    $relativePath = $_POST['relative_path'][$key]; // 需要前端传递
    $fullPath = $uploadDir . $relativePath;

    // 创建不存在的目录
    $dirPath = dirname($fullPath);
    if(!is_dir($dirPath)){
        mkdir($dirPath, 0777, true);
    }

    move_uploaded_file($_FILES['files']['tmp_name'][$key], $fullPath);
}

安全性考虑

验证文件类型和大小:

php实现上传文件夹

$allowedTypes = ['image/jpeg', 'application/pdf'];
$maxSize = 5 * 1024 * 1024; // 5MB

foreach($_FILES['files']['name'] as $key => $name){
    $type = $_FILES['files']['type'][$key];
    $size = $_FILES['files']['size'][$key];

    if(!in_array($type, $allowedTypes) || $size > $maxSize){
        continue; // 跳过不符合要求的文件
    }

    // 处理上传
}

进度显示实现

使用AJAX上传可以显示进度:

// 前端使用FormData和XMLHttpRequest
let formData = new FormData();
for(let file of files){
    formData.append('files[]', file);
}

let xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', function(e){
    let percent = Math.round((e.loaded / e.total) * 100);
    console.log(percent + '%');
});

xhr.open('POST', 'upload.php');
xhr.send(formData);

大文件分块上传

对于大文件夹,可以考虑分块上传:

// 前端将大文件分块
const CHUNK_SIZE = 5 * 1024 * 1024; // 5MB每块
let start = 0;

while(start < file.size){
    let chunk = file.slice(start, start + CHUNK_SIZE);
    formData.append('chunks[]', chunk);
    start += CHUNK_SIZE;
}

PHP端需要合并分块:

// 根据文件名合并分块
$targetFile = $uploadDir . $fileName;
file_put_contents($targetFile, file_get_contents($chunkPath), FILE_APPEND);

以上方法实现了文件夹上传的基本功能,包括目录结构保持、安全验证和进度显示等扩展功能。

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

相关文章

js实现文件夹

js实现文件夹

使用JavaScript创建文件夹 在浏览器端的JavaScript中无法直接操作文件系统创建文件夹,这是出于安全考虑。但在Node.js环境中可以通过文件系统模块(fs)实现。 Node.js中使…

vue实现拖拽上传

vue实现拖拽上传

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

vue实现拍摄视频上传

vue实现拍摄视频上传

Vue实现拍摄视频上传的方法 使用HTML5的<input type="file">和capture属性 在Vue模板中添加一个文件输入元素,通过capture属性指定使用摄像头拍摄视频:…

react实现照片上传

react实现照片上传

实现照片上传的基本步骤 在React中实现照片上传功能通常涉及前端表单处理、文件选择、预览以及后端API交互。以下是具体实现方法: 创建文件上传表单组件 使用HTML的<input type=…

php实现上传进度条

php实现上传进度条

PHP 文件上传进度条实现方法 在PHP中实现文件上传进度条需要结合前端和后端技术,以下是一种常见的实现方案: 使用 session.upload_progress 功能 PHP 5.4+ 内置了上…

php实现网盘文件夹

php实现网盘文件夹

PHP实现网盘文件夹功能 使用PHP实现网盘文件夹功能需要处理文件上传、目录管理、权限控制等核心模块。以下是具体实现方法: 数据库设计 创建必要的数据库表存储文件和文件夹信息: CREATE TA…