使用PHP

时间:2015-05-04 07:51:38

标签: php mysql base64 blob

我有这个客户将文件保存为base64到MEDIUMBLOB字段(请不要问为什么)。

文件保存如下:

$file      = file_get_contents($_FILES['file']['tmp_name']);
$file      = base64_encode($file);
$file      = mysql_real_escape_string($file);
$file_name = mysql_real_escape_string($_FILES['file']['name']);
$file_ext  = mysql_real_escape_string($_FILES['file']['type']);

$sql = "INSERT INTO $file_table_name (file, file_name, file_ext) VALUES ('$file', '$file_name', '$file_ext')";

这是我用来强制下载文件的代码:

header('Content-type: ' . $data->file_ext);
header('Content-Disposition: attachment;filename="' . $data->file_name . '"');
echo base64_decode($data->file);
die();

出于某种原因,这适用于PDF文件,但不适用于图像文件。当我尝试在Windows预览中打开文件时,它说:“Windows Photo Viewer无法打开此图片,因为该文件似乎已损坏,损坏或太大”。原始文件大约是150KB。

如果我这样做;

echo '<img src="data:' . $data->file_ext . ';base64,'.$data->file.'" />';
die();

...图像看起来很好,我可以保存图像(另存为)而不会出现问题。

任何人都知道我做错了什么?我错过了任何标题吗?


使用数据库中的值进行更新:

file_name:'test.png'
file_ext:'image / png'
档案: https://gist.githubusercontent.com/horgen/25298f2689d9aed865db/raw/gistfile1.txt

原始文件: http://cl.ly/image/2o3X3u3a0V0S
已编码的文件: http://cl.ly/image/1S3K3v0x0U0p

2 个答案:

答案 0 :(得分:1)

尝试使用readfile(base64_decode($ data-&gt; file))而不是echo。

答案 1 :(得分:1)

你可以尝试

echo base64_decode(str_replace(' ', '+', $data->file));

请参阅base64_decode()的PHP手册页以及页面上的注释。