【问题标题】:how to download blob based file from MySQL database in PHP?如何在 PHP 中从 MySQL 数据库下载基于 blob 的文件?
【发布时间】:2014-02-13 00:12:29
【问题描述】:

我如何制作一个 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 文件下载到我的硬盘上?

【问题讨论】:

  • 一个很好的理由不在数据库中存储文件。
  • @Dagon 那我应该把它们存放在哪里?
  • Content-type 应该是 image/jpeg 可能会或可能不会解决您遇到的问题。老实说,您应该只将图像的路径存储在数据库中,而不是将它们存储为 blob
  • 文件应该存储在文件系统中
  • @elitechief21 我在上面的问题中使用的图像示例只是一个示例。我也想允许存储 zip 文件夹和 word 文档。

标签: php mysql download blob


【解决方案1】:

这是处理 blob 文件时最常见的问题。从您的示例中,我可以看到您正在将“fileType”保存为文件的扩展名(即“jpg”用于图像,“pdf”用于 pdf 文件等),您正在上传。但您可以将文件类型另存为 MIME 内容类型。

假设如果您上传 jpeg 图像 - MIME 类型将作为“image/jpeg”存储在“fileType”中。同样,对于 pdf,它将被存储为“application/pdf”。我设计了这样的代码来从数据库下载 blob 文件。我将假设文件已经上传到您创建的数据库表中。

数据库表“上传”

|文件ID |文件名 |文件类型 |文件大小 |文件数据 |用户名 |

download.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;

?>

你可以找到blob-upload的完整代码here

【讨论】:

  • 这工作正常,当我将它从 HTML 定向到 PHP 并强制下载时,但使用 jQuery 和 PHP 时它不起作用。内容在控制台中得到回显,但没有下载文件!
  • @tmzafar 是的,这就是 AJAX 的工作方式——响应返回到 JavaScript。不要期望通过 Ajax 下载文件。
【解决方案2】:

您可以使用会话并发布文件名和文件内容到下载页面

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;

【讨论】:

  • 与会话变量无关,与mime类型有关
猜你喜欢
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 2017-01-06
  • 2013-03-20
  • 2015-12-12
  • 2016-09-02
  • 1970-01-01
相关资源
最近更新 更多