当前位置:首页 > PHP

php实现网盘文件夹

2026-02-14 05:52:36PHP

PHP实现网盘文件夹功能

数据库设计

创建一个数据库表存储文件夹和文件信息,示例结构如下:

php实现网盘文件夹

CREATE TABLE `files` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `path` varchar(255) NOT NULL,
  `type` enum('file','folder') NOT NULL,
  `size` bigint(20) DEFAULT 0,
  `parent_id` int(11) DEFAULT NULL,
  `user_id` int(11) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`)
);

创建文件夹功能

function createFolder($folderName, $parentId = null, $userId) {
    $db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');

    // 检查同名文件夹是否已存在
    $stmt = $db->prepare("SELECT id FROM files WHERE name = ? AND parent_id = ? AND user_id = ? AND type = 'folder'");
    $stmt->execute([$folderName, $parentId, $userId]);

    if($stmt->fetch()) {
        return ['success' => false, 'message' => '文件夹已存在'];
    }

    // 插入新文件夹记录
    $stmt = $db->prepare("INSERT INTO files (name, path, type, parent_id, user_id) VALUES (?, ?, 'folder', ?, ?)");
    $path = $parentId ? getFolderPath($parentId).'/'.$folderName : $folderName;
    $success = $stmt->execute([$folderName, $path, $parentId, $userId]);

    return ['success' => $success, 'message' => $success ? '文件夹创建成功' : '创建失败'];
}

获取文件夹路径

function getFolderPath($folderId) {
    $db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
    $stmt = $db->prepare("SELECT path FROM files WHERE id = ?");
    $stmt->execute([$folderId]);
    $result = $stmt->fetch();
    return $result ? $result['path'] : '';
}

列出文件夹内容

function listFolderContents($folderId, $userId) {
    $db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
    $stmt = $db->prepare("SELECT * FROM files WHERE parent_id = ? AND user_id = ? ORDER BY type DESC, name ASC");
    $stmt->execute([$folderId, $userId]);
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

文件上传处理

function uploadFile($file, $folderId, $userId) {
    $targetDir = "uploads/".$userId."/";
    if(!file_exists($targetDir)) {
        mkdir($targetDir, 0777, true);
    }

    $fileName = basename($file["name"]);
    $targetPath = $targetDir . uniqid() . '_' . $fileName;

    if(move_uploaded_file($file["tmp_name"], $targetPath)) {
        $db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
        $path = $folderId ? getFolderPath($folderId).'/'.$fileName : $fileName;
        $stmt = $db->prepare("INSERT INTO files (name, path, type, size, parent_id, user_id) VALUES (?, ?, 'file', ?, ?, ?)");
        $stmt->execute([$fileName, $path, $file["size"], $folderId, $userId]);
        return true;
    }
    return false;
}

前端界面示例

<!-- 文件夹创建表单 -->
<form action="create_folder.php" method="post">
    <input type="text" name="folder_name" placeholder="文件夹名称" required>
    <input type="hidden" name="parent_id" value="<?= $currentFolderId ?>">
    <button type="submit">创建文件夹</button>
</form>

<!-- 文件上传表单 -->
<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file" required>
    <input type="hidden" name="folder_id" value="<?= $currentFolderId ?>">
    <button type="submit">上传文件</button>
</form>

<!-- 文件夹内容列表 -->
<ul>
    <?php foreach($folderContents as $item): ?>
    <li>
        <?= $item['type'] === 'folder' ? '📁' : '📄' ?>
        <?= htmlspecialchars($item['name']) ?>
        <?= $item['type'] === 'file' ? '(' . formatSize($item['size']) . ')' : '' ?>
    </li>
    <?php endforeach; ?>
</ul>

安全注意事项

  • 验证用户权限确保用户只能访问自己的文件
  • 对用户输入进行过滤和转义防止SQL注入
  • 文件上传时检查文件类型和大小限制
  • 使用预处理语句处理数据库查询
  • 对文件路径进行安全处理防止目录遍历攻击

性能优化建议

  • 对大文件使用分块上传
  • 实现文件秒传功能(检查文件哈希值)
  • 对频繁访问的文件夹内容进行缓存
  • 使用CDN加速文件下载
  • 对数据库查询添加适当的索引

标签: 文件夹php
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 // 创建…

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searchT…

php队列的实现

php队列的实现

PHP队列的实现方式 PHP中实现队列功能可以通过多种方式,根据需求选择适合的方案: 使用数组实现基础队列 PHP数组本身支持队列操作,利用array_push和array_shift函数: $q…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…