使用 unpack php 将文件保存在数据库中

Posted

技术标签:

【中文标题】使用 unpack php 将文件保存在数据库中【英文标题】:saving file in database using unpack php 【发布时间】:2019-02-07 07:58:16 【问题描述】:
$data = '0x'.unpack('H*hex', file_get_contents($tmp_name))['hex'];

我正在尝试使用上述代码将文件数据存储到我的数据库中。然后我检索它并将其用作下载

header('Content-Description: File Transfer');
header("Content-Transfer-Encoding: Binary");
header('Content-Disposition: attachment; filename="'.basename( $response->strFileName ).'"');
header('Cache-Control: must-revalidate');
header('Content-Length: '.$response->intSize);
echo $response->binFile;

其中$response->binFile 是来自服务器的响应,即我存储上述代码中的数据的列。

这适用于 pdf 文件,但不适用于图像 jpg/png。图像的大小比原始文件小,我得到错误

当我下载并打开它时上传的图像。 PDF没问题

右边是原图,左边是上传到数据库然后下载的图片。使用上面的代码

我不知道是否值得一提,但我下载的图像没有尺寸,如下所示:

右侧上传,左侧下载原件

【问题讨论】:

你在用unpack 代码做什么...?!您是否尝试过比较服务器对原始文件的响应以查看差异可能在哪里?您是否尝试过设置适当的 Content-Type 标头? 唯一的区别是我将显示示例图像属性的大小 @deceze 请参阅更新的 OP。图像大小有细微差别。但是在 PDF 中是一样的。 好吧,即使大小相同。同样,使用差异程序或十六进制编辑器来比较实际文件内容。如果那还不行,那就更清楚地了解我们在那里看到的内容。是什么程序告诉你它“不支持这种格式”? @deceze 它是一个默认的 Windows 图像查看器。让我看看你的建议 【参考方案1】:

我使用了下面的标题。并解决了问题

ob_clean();
header("Content-type: ".$response->strExtension.""); 
header("Cache-Control: no-store, no-cache");  
header("Content-length: ".$response->intSize.""); 
header("Content-Disposition: attachment; filename=".basename($response->strFileName).""); 
echo base64_decode($response->binFile);

【讨论】:

以上是关于使用 unpack php 将文件保存在数据库中的主要内容,如果未能解决你的问题,请参考以下文章

PHP - unpack() uint8_t 和 uint16_t

Qt4 中的 PHP unpack() 模拟函数

在 struct.unpack 格式字符串中间切换字节顺序

为啥函数在 php 中以 @ 开头?像@unpack(xxx)? [复制]

Javascript Mismatch 中的 PHP Pack/Unpack 实现

使用 php 将 PDF 文件保存到 XML 文件