上传button>form>
在PHP网站中实现从数据库下载文件的功能,通常需要以下步骤:将文件以二进制形式存储在数据库中,或仅存储文件路径,然后通过PHP脚本读取并输出文件内容到浏览器。以下是两种常见方法的详细实现:
方法一:文件存储在数据库中(BLOB字段)
1. 数据库表设计
sql
CREATE TABLE files ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR、7) NOT NULL, -- 文件名 type VARCHAR(100) NOT NULL, -- 文件类型(如 application/pdf) size INT NOT NULL, -- 文件大小(字节) content LONGBLOB NOT NULL, -- 文件二进制数据 upload_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
2. 上传文件到数据库(示例代码)
php
// 数据库连接$conn = new PDO("mysql:host=localhost;dbname=your_db", "username", "password");if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) { $file = $_FILES['file']; $name = $file['name']; $type = $file['type']; $size = $file['size']; $content = file_get_contents($file['tmp_name']); // 插入数据库 $stmt = $conn->prepare("INSERT INTO files (name, type, size, content) VALUES (?, ?, ?, ?)"); $stmt->execute([$name, $type, $size, $content]); echo "文件上传成功!";}?>
3. 下载文件(通过ID)
php
// 数据库连接$conn = new PDO("mysql:host=localhost;dbname=your_db", "username", "password");if (isset($_GET['file_id'])) { $fileId = $_GET['file_id']; // 查询文件信息 $stmt = $conn->prepare("SELECT name, type, size, content FROM files WHERE id = ?"); $stmt->execute([$fileId]); $file = $stmt->fetch(PDO::FETCH_ASSOC); if ($file) { header('Content-Type: ' . $file['type']); header('Content-Disposition: attachment; filename="' . $file['name'] . '"'); header('Content-Length: ' . $file['size']); echo $file['content']; exit; } else { echo "文件不存在!"; }}?>下载文件a>
方法二:文件存储在服务器,数据库仅保存路径
1. 数据库表设计
sql
CREATE TABLE files ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, -- 原始文件名 path VARCHAR(512) NOT NULL, -- 服务器存储路径 type VARCHAR(100) NOT NULL, -- 文件类型 size INT NOT NULL, -- 文件大小 upload_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
2. 上传文件并保存路径
php
$conn = new PDO("mysql:host=localhost;dbname=your_db", "username", "password");if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) { $uploadDir = 'uploads/'; // 确保目录存在且可写 if (!is_dir($uploadDir)) { mkdir($uploadDir, 0755, true); } $fileName = basename($_FILES['file']['name']); $filePath = $uploadDir . uniqid() . '_' . $fileName; $fileType = $_FILES['file']['type']; $fileSize = $_FILES['file']['size']; if (move_uploaded_file($_FILES['file']['tmp_name'], $filePath)) { // 保存路径到数据库 $stmt = $conn->prepare("INSERT INTO files (name, path, type, size) VALUES (?, ?, ?, ?)"); $stmt->execute([$fileName, $filePath, $fileType, $fileSize]); echo "文件上传成功!"; } else { echo "文件上传失败!"; }}?>
3. 下载文件(通过ID)
php
$conn = new PDO("mysql:host=localhost;dbname=your_db", "username", "password");if (isset($_GET['file_id'])) { $fileId = $_GET['file_id']; $stmt = $conn->prepare("SELECT name, path, type, size FROM files WHERE id = ?"); $stmt->execute([$fileId]); $file = $stmt->fetch(PDO::FETCH_ASSOC); if ($file && file_exists($file['path'])) { header('Content-Type: ' . $file['type']); header('Content-Disposition: attachment; filename="' . $file['name'] . '"'); header('Content-Length: ' . $file['size']); readfile($file['path']); // 直接输出文件内容 exit; } else { echo "文件不存在!"; }}?>
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.