1

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

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 开发了这个脚本,并且没有任何文件在那里损坏。但是该脚本部署在具有 php 5.3.10 的 Ubuntu 服务器上,并且文件在那里损坏。

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

4

1 回答 1

1

看起来要么:

  1. 您正在以“转义”格式编码到数据库并以十六进制格式从中读取。

  2. 您需要强制转换“当客户端和后端字符编码不匹配时,可能会出现多字节流错误。用户必须然后强制转换为bytea以避免此错误。” 从pg_escape_bytea 文档中,它也算作 unscape。

在此处查看第 8.1 节

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

于 2016-03-21T23:11:32.793 回答