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加速文件下载
- 对数据库查询添加适当的索引







