2012-03-12 204 views
-1

我已经提供的图片上传到mysql数据库问题与PHP从MySQL检索图像

编码我也做

$content = addslashes($content); 
    $content = base64_encode($content); 

那之后我已经测试图像之前之前使用下面的代码数据库它输入正常。

但是,每当我尝试下载相同的图像时,它在文件系统上保存的很好,但从不让我查看它。因为,它给我不正确的图像文件。为什么如此

$file_data= $this->get_attachment($id); 
      $content = $file_data['content']; 
       $content = stripslashes($content); 
      $content = base64_decode(); 
      header("Content-length: ". strlen($content)); 
      header("Content-type: ".$file_data['filetype']); 
      header("Content-Disposition: attachment; filename=".$file_data['filename']); 
      echo $content; 

急需帮助将不胜感激。

+0

什么是你正在存储base64字符串的MySQL列的数据类型?如果它是varchar而不是TEXT或BLOB,则可能会截断。 – 2012-03-12 13:01:46

+0

...并且根据大小,可以用TEXT和BLOB截断。 – hakre 2012-03-12 13:03:43

+0

我已经使用LongBLOB,所以基本上它不是一个截断问题 – 2012-03-12 13:05:30

回答

1

您正在发送base64编码字符串的文件长度$file_data['content']而是发送解码后的长度为$content

$content = base64_decode($file_data['content']); 
// Send the Content-length of the decoded data $content 
// Should work, since strlen() is binary safe 
header("Content-length: ". strlen($content)); 
+0

感谢您的紧急答复,我已经测试了它,但是,没有运气 – 2012-03-12 12:58:35

0

为什么会这样[?]

已存储一些数据到数据库中。在检索时,你没有得到原始数据。这就是为什么。

这是什么造成的?可能有很多事情导致这种情况。从你在你的问题已经提出的这些信息,我只能猜测:

  • 错误的长度给(你的情况另存为过程所期望的更多的字节然后发送和衬垫用NULL字节或别的文件深奥)。
  • 给出的数据错误。您从数据库检索到的数据可能由于截断而不再是原始数据,例如,您存储数据的字段太小而无法保存所有数据。

请仔细检查您的代码的编码/解码部分(测试它!)并确保database column has a fitting type­Docs以及存储您的数据。将原始内容的长度与从数据库中检索的长度进行比较。另外,您可以为数据添加校验和(例如md5),以测试数据是否已更改。

+0

当我检索文本文件时,它工作正常,但每当我去寻找二进制文件,它给了我这样的困难时期。 – 2012-03-12 13:21:40

+0

最初的图像数据有多大(以字节为单位)? 'base64-encode'甚至会使它变大。并且列旁边的大小有限制,例如,用于与数据库进行通信。我建议你首先删除base64编码,因为LONGBLOB数据类型非常好地存储二进制数据。 – hakre 2012-03-12 13:25:51

+0

我刚刚测试了一件事,但不知道为什么发生这样的事情,我上传的图像是680KB,但我下载的图像是698 KB – 2012-03-12 13:50:33