我如何制作一个 PHP 脚本,允许我从 MySQL 的数据库下载文件。 我有一个名为
files
的表,其中上传的文件保存在基于 BLOB
的字段中。
+-------+----------+----------+------------+-------------------+--------+
|fileID | fileName | fileType | fileSize |fileData | userID |
+-------+----------+----------+------------+-------------------+--------+
| 1 | file1 | JPEG | 211258 |[BLOB - 206.3 KiB] | 1 |
| 2 | file2 | PNG | 211258 |[BLOB - 201.3 KiB] | 1 |
+-------+----------+----------+------------+-------------------+--------+
我无法找到调用文件下载的方法,每次尝试时,我都会获取文件的二进制数据,例如随机数和符号。
我尝试过此查询,其中参数通过(fileID、fileName、fileType)传递到 download.php 页面:
$id = mysqli_real_escape_string($link, $_GET['fileID']);
$name = mysqli_real_escape_string($link, $_GET['fileName']);
$type = mysqli_real_escape_string($link, $_GET['fileType']);
$SELECT = "SELECT * FROM files WHERE fileID = $id AND fileName = $name ";
$result = mysqli_query($SELECT, $link);
$result = mysqli_fetch_assoc($result);
header("Content-type: $type");
echo $result['fileData'];
但这会导致空白页面,没有输出。
如何将 file1 作为 JPEG 文件下载到我的硬盘上?
这是处理 blob 文件时最常见的问题。从您的示例中,我可以看到您正在将“fileType”保存为正在上传的文件的扩展名(即图像的“jpg”,pdf文件的“pdf”等)。但您也可以将文件类型另存为 MIME 内容类型。
假设如果您上传 jpeg 图像 - MIME 类型将作为“image/jpeg”存储在“fileType”中。同样,对于 pdf,它将存储为“application/pdf”。我设计了这样的代码来从数据库下载 blob 文件。我假设文件已经上传到您创建的数据库表中。
数据库表“上传”
|文件ID |文件名 |文件类型 |文件大小|文件数据|用户 ID |
下载.php
<?php
$connection = mysqli_connect("localhost","root"," ",your_database);
$id = 1;
$query = "SELECT * FROM uploads WHERE userID = ?";
$result = $connection->execute_query($query, [$id]);
list($id, $file, $type, $size, $content) = mysqli_fetch_array($result);
header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$file");
echo $content;
您可以在这里找到blob-upload的完整代码。
您可以使用会话并发布文件名和文件内容来下载页面
session_start();
$_SESSION['filename'] = $filename
$_SESSION['file'] = $file
<a href="download.php">echo "Download File"</a>
并在 download.php 中使用此代码
session_start();
$filename = $_SESSION['filename'];
$file = $_SESSION['file'];
header("Content-Disposition: attachment; filename=$filename");
ob_clean();
flush();
echo $file;