2016-03-21 2 views
1

У меня есть автоматический скрипт PHP, который подключается к почтовому ящику, читает электронные письма и обрабатывает их для создания билетов. Некоторые из этих писем содержат различные типы вложений файлов. Мой скрипт использует следующий код для сохранения файлов непосредственно в посттермическую базу данных. Я использую codeigniter.PHP base64_encode PDF-файл поврежден

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?

+0

Никто не имеет понятия? –

+0

Код, который вы используете для чтения файла из базы данных, также будет интересен. И случайно, можете ли вы предоставить нам PDF-файл, который поврежден? Кроме того, PHP 5.3 заканчивается с 2014 года. Возможно, обновление - это решение ... – Kontrollfreak

ответ

1

Выглядит как:

  1. вы кодирование в базу данных в формате «побег» и чтение из него в шестнадцатеричном формате.

  2. Вам необходимо указать «когда клиентское и кодированное кодирование символов не совпадают, и может быть многобайтовая ошибка потока. Затем пользователь должен передать в bytea, чтобы избежать этой ошибки». От pg_escape_bytea documentation, это также считается unscape.

Проверить раздел 8.1 here

Если это не проблема, я бы сохранить bin2hex выход на поле непосредственно.

+1

Я передал соединение db с pg_escape_bytea funtion, и теперь он работает нормально. $ filedata ['filedata'] = pg_escape_bytea ($ db, base64_encode (file_get_contents ($ fileurl))); Спасибо за ваш ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^