系统架构概述
本系统是一个典型的Web应用,由PHP脚本、MySQL数据库和HTML/CSS前端组件构成。PHP用于处理文件的上传、下载和展示,MySQL用于存储文件的元信息,前端组件提供用户界面。系统主要分为以下几个模块:
- 主界面:用于展示文件列表和操作按钮。
- 数据库配置:配置MySQL数据库连接信息。
- 文件上传API:提供文件上传接口,处理文件存储和防重复上传。
数据库设计
数据库的设计主要围绕文件的元信息展开。以下是一个简单的文件表结构:
CREATE TABLE `files` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`type` VARCHAR(10) NOT NULL,
`size` INT NOT NULL,
`hash` VARCHAR(32) NOT NULL,
`addtime` DATETIME NOT NULL,
`ip` VARCHAR(15) NOT NULL,
`hide` TINYINT NOT NULL DEFAULT 0,
`pwd` VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (`id`)
);
该表结构支持存储文件的各种元信息,包括文件名、类型、大小、哈希值、上传时间、上传者IP地址、是否隐藏和下载密码。
文件上传API
文件上传API是文件管理系统的重要组成部分,以下是一个简单的文件上传接口示例:
<?php
// 文件上传接口
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 获取上传的文件
$file = $_FILES['file'];
// 检查文件大小
if ($file['size'] > 5000000) {
die('文件过大');
}
// 生成文件哈希值
$hash = md5_file($file['tmp_name']);
// 查询数据库中是否存在同名文件
$stmt = $pdo->prepare("SELECT * FROM files WHERE hash = :hash");
$stmt->execute(['hash' => $hash]);
if ($stmt->rowCount() > 0) {
die('文件已存在');
}
// 移动文件到服务器
$uploadPath = 'uploads/' . $hash;
move_uploaded_file($file['tmp_name'], $uploadPath);
// 插入文件信息到数据库
$stmt = $pdo->prepare("INSERT INTO files (name, type, size, hash, addtime, ip) VALUES (:name, :type, :size, :hash, NOW(), :ip)");
$stmt->execute([
'name' => $file['name'],
'type' => $file['type'],
'size' => $file['size'],
'hash' => $hash,
'ip' => $_SERVER['REMOTE_ADDR']
]);
echo '文件上传成功';
} else {
// 返回文件上传表单
echo '<form method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="上传文件" />
</form>';
}
?>
文件列表展示
在主界面中,我们需要展示文件列表,以下是一个简单的文件列表展示示例:
<?php
// 获取文件列表
$stmt = $pdo->prepare("SELECT * FROM files");
$stmt->execute();
$files = $stmt->fetchAll();
// 展示文件列表
echo '<ul>';
foreach ($files as $file) {
echo '<li>
<a href="uploads/' . $file['hash'] . '">' . $file['name'] . '</a>
<span>' . $file['size'] . ' bytes</span>
<span>' . $file['addtime'] . '</span>
</li>';
}
echo '</ul>';
?>
总结
本文介绍了如何从零构建一个基于PHP和MySQL的文件管理系统,包括系统架构、数据库设计和API实现。通过以上示例代码,您可以快速搭建一个简单的文件管理系统,并根据实际需求进行功能扩展和优化。