PHP base64_encode PDF 文件损坏
PHP base64_encode PDF File Corrupted
我有一个自动 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 开发了这个脚本,没有文件在那里损坏。但是脚本部署在 Ubuntu 服务器上 php 5.3.10 并且文件在那里被损坏。
我试图找出造成这种情况的原因,但到目前为止还没有锁定。这是因为 php 版本不同吗?
看起来是:
您正在以 "escape" 格式编码到数据库并以十六进制格式从中读取。
你需要从pg_escape_bytea documentation转换"when the client and backend character encoding does not match, and there may be multi-byte stream error. User must then cast to bytea to avoid this error.",它也算作unscape。
检查第 8.1 节 here
如果不是问题,我会将 bin2hex 输出直接保存到该字段。
我有一个自动 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 开发了这个脚本,没有文件在那里损坏。但是脚本部署在 Ubuntu 服务器上 php 5.3.10 并且文件在那里被损坏。
我试图找出造成这种情况的原因,但到目前为止还没有锁定。这是因为 php 版本不同吗?
看起来是:
您正在以 "escape" 格式编码到数据库并以十六进制格式从中读取。
你需要从pg_escape_bytea documentation转换"when the client and backend character encoding does not match, and there may be multi-byte stream error. User must then cast to bytea to avoid this error.",它也算作unscape。
检查第 8.1 节 here
如果不是问题,我会将 bin2hex 输出直接保存到该字段。