PHP base64_encode PDF文件已损坏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP base64_encode PDF文件已损坏相关的知识,希望对你有一定的参考价值。

我有一个自动php脚本,它连接到一个电子邮箱,读取电子邮件并处理它们以创建票证。其中一些电子邮件包含各种类型的文件附件。我的脚本使用以下代码将文件直接保存到postgress数据库。我正在使用codeigniter。

public function saveFiles($filename, $fileurl, $jobid) {
     $filedata = array();
     $filedata['filename']= $filename;
     $filedata['filedescription'] = 'Incoming attachment.';
     $filedata['fileargid'] = $jobid;
     $filedata['fileaddedon'] = date('Y-m-d H:i:s P');
     $filedata['filedata'] = pg_escape_bytea(base64_encode(file_get_contents($fileurl)));

     $results = $this->db->insert('file', $filedata);
     if ($results)
         return $this->db->insert_id();
     else
         return FALSE;
}

但是,大多数文件都保存没有任何问题。我的问题是当我部署这个脚本时,一些pdf文件被破坏了。脚本在编码到base64之前将文件保存到本地磁盘。所有这些文件都是健康的。我怀疑在pg_escape_bytea(base64_encode(file_get_contents($fileurl)))期间发生了一些事情。

我在我的本地PC上使用php 5.5.9 / Ubuntu开发了这个脚本,并且没有文件在那里被破坏。但是脚本部署在带有5.3.5的Ubuntu服务器上,文件在那里被破坏了。

我试图找出导致这种情况的原因但到目前为止没有锁定。这是因为不同的php版本?

答案

看起来:

  1. 你以“转义”格式编码到数据库并以十六进制格式读取它。
  2. 您需要强制转换“当客户端和后端字符编码不匹配时,可能存在多字节流错误。用户必须转换为bytea以避免此错误。”来自pg_escape_bytea documentation,它也算不上风景。

检查第8.1节here

如果不是问题,我会直接将bin2hex输出保存到字段中。

以上是关于PHP base64_encode PDF文件已损坏的主要内容,如果未能解决你的问题,请参考以下文章

BASE64Encoder,BASE64Decoder加密后再解密不成功

base64_encode 字符串的 php 大小 - 文件

如何用base64格式编码pdf文件?

利用base64函数,对文件进行转码加密

从 base64 字符串 PHP 生成 PDF

PHP base64_encode 在URL地址参数编码上使用