系统架构概述

本系统是一个典型的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实现。通过以上示例代码,您可以快速搭建一个简单的文件管理系统,并根据实际需求进行功能扩展和优化。