Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中从MySQL数据库下载基于blob的文件?_Php_Mysql_Download_Blob - Fatal编程技术网

如何在PHP中从MySQL数据库下载基于blob的文件?

如何在PHP中从MySQL数据库下载基于blob的文件?,php,mysql,download,blob,Php,Mysql,Download,Blob,如何制作一个PHP脚本,允许我从MySQL中的数据库下载文件。 我有一个名为files的下表,其中上载的文件保存在基于BLOB的字段中 +-------+----------+----------+------------+-------------------+--------+ |fileID | fileName | fileType | fileSize |fileData | userID | +-------+----------+----------+---

如何制作一个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'];
但这会导致一个没有输出的空白页


例如,如何将文件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;