У меня есть автоматический 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)))
,
Я разработал этот скрипт, используя php 5.5.9 / Ubuntu на моем локальном компьютере, и там не было повреждено ни одного файла. Но скрипт развернут на сервере Ubuntu с php 5.3.10 и файлы там повреждены.
Я пытался выяснить, что является причиной этого, но пока без блокировки. Это из-за разных версий php?
Выглядит либо:
Вы кодируете в базу данных в формате «escape» и читаете из нее в шестнадцатеричном формате.
Необходимо выполнить приведение «когда кодировка символов клиента и бэкэнда не совпадает, и может быть ошибка многобайтового потока. Затем пользователь должен привести к bytea, чтобы избежать этой ошибки». От pg_escape_bytea документация, это также имеет значение для выхода.
Проверьте раздел 8.1 Вот
Если не проблема, я бы сохранил вывод bin2hex непосредственно в поле.
Других решений пока нет …