如何在PHP中从MySQL数据库下载基于blob的文件?
如何制作一个PHP脚本,允许我从MySQL中的数据库下载文件。 我有一个名为如何在PHP中从MySQL数据库下载基于blob的文件?,php,mysql,download,blob,Php,Mysql,Download,Blob,如何制作一个PHP脚本,允许我从MySQL中的数据库下载文件。 我有一个名为files的下表,其中上载的文件保存在基于BLOB的字段中 +-------+----------+----------+------------+-------------------+--------+ |fileID | fileName | fileType | fileSize |fileData | userID | +-------+----------+----------+---
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'];
但这会导致一个没有输出的空白页
例如,如何将文件1作为JPEG文件下载到硬盘?这是处理blob文件时遇到的最常见问题。从您的示例中,我可以看到您正在将“fileType”保存为文件的扩展名(即图像的“jpg”,pdf文件的“pdf”等),您正在上载。但是,您可以将文件类型另存为MIME内容类型 假设上载jpeg图像,MIME类型将作为“图像/jpeg”存储在“文件类型”中。同样,对于pdf,它将存储为“应用程序/pdf”。我设计了这样的代码来从数据库下载blob文件。我假设这些文件已经上传到您创建的数据库表中 数据库表“上载” |fileID | fileName | fileType | fileSize | fileData | userID| 下载.php
<?php
$connection = mysqli_connect("localhost","root"," ",your_database)
or die('Database Connection Failed');
mysqli_set_charset($connection,'utf-8');
$id = 1;
// Use a prepared statement in production to avoid SQL injection;
// we can get away with this here because we're the only ones who
// are going to use this script.
$query = "SELECT * " ."FROM uploads WHERE userID = '$id'";
$result = mysqli_query($connection,$query)
or die('Error, query failed');
list($id, $file, $type, $size,$content) = mysqli_fetch_array($result);
header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$file");
ob_clean();
flush();
echo $content;
mysqli_close($connection);
exit;
?>
您可以使用会话和post文件名以及文件内容下载页面
session_start();
$_SESSION['filename'] = $filename
$_SESSION['file'] = $file
<a href="download.php">echo "Download File"</a>
不在数据库中存储文件的一个很好的理由。@Dagon那么我应该将文件存储在哪里?内容类型应为image/jpeg
,这可能会或可能不会解决您的问题。老实说,您应该只在数据库中存储图像的路径,而不是将它们存储为blobsfile。文件应该存储在文件中system@elitechief21我在上面的问题中使用的图像示例只是一个示例。我想允许存储zip文件夹和word文档。这与会话变量无关,但与mime类型有关。当我将它从HTML定向到PHP并强制下载时,它工作得很好,但使用jQuery&PHP它不工作。内容在控制台中得到响应,但没有下载任何文件@tmzafar是的,AJAX就是这样工作的——响应返回到JavaScript。不要期望通过Ajax下载文件。
session_start();
$filename = $_SESSION['filename'];
$file = $_SESSION['file'];
header("Content-Disposition: attachment; filename=$filename");
ob_clean();
flush();
echo $file;