Большие файлы .PDF не загружаются в базу данных MySQL как средний BLOB через PHP, файлы под 2MB работают нормально

Я разрабатываю PHP-скрипт для загрузки .PDF-документов в виде средних BLOB-файлов в базу данных MySQL через PHP. Сценарий также позволяет пользователям искать файлы и открывать / скачивать их, но я не думаю, что часть скрипта имеет отношение к моей проблеме. Скрипт отлично работает с файлами размером менее 2 МБ, но как только я попытаюсь загрузить файл объемом более 2 МБ, ничто не помещается в мой контент (средний BLOB), и для типа mime нет значения. Я уже пытался увеличить max_packet_size для сервера MySQL до 4 МБ от значения по умолчанию 1 МБ. Я также обновил php.ini до правильных значений. Я устанавливаю upload_max_size в 4MB, post_max_size – 4 МБ, а memory_limit – 16 МБ. Я действительно не экспериментировал с max_input_time, хотя из-за того, что он по умолчанию равен 60 секундам, что кажется большим, учитывая, что этот скрипт предназначен для внутреннего приложения в интрасети.

Я также пытался поймать ошибки из объекта PDO в моем скрипте с errorInfo () и errorCode () и оба через 0 (без ошибок).

Вот раздел загрузки моего скрипта:

if ($key == 'upload') { set_time_limit(0); $_SESSION['upload'] = $value; if ($_FILES['userfile']['name']) { $fileName = $_FILES['userfile']['name']; $tmpName = $_FILES['userfile']['tmp_name']; $fileSize = $_FILES['userfile']['size']; $fileType = $_FILES['userfile']['type']; $docType = $_POST['docType']; $netKey = $_POST['netKey']; $fp = fopen($tmpName, 'r'); $content = fread($fp, filesize($tmpName)); $content = addslashes($content); fclose($fp); $_SESSION['filetype'] = $fileType; if(!get_magic_quotes_gpc()) { $fileName = addslashes($fileName); } $sqlCheck = "SELECT id, name, documentType, networkKey FROM upload WHERE active='1'"; foreach ($dbh->query($sqlCheck) as $row) { if (($row['name'] == $fileName) && ($row[networkKey] == $netKey) && ($row['documentType'] == $docType)) { $_SESSION['updateRow'] = $row['id']; } } if ($_SESSION['updateRow']) { $deactivateDuplicate = "UPDATE upload SET active = 0, modifiedBy = '".strtoupper($_SERVER['REMOTE_USER'])."', modifiedDate = Now() WHERE id = '".$_SESSION['updateRow']."' AND active ='1'"; $dbh->query($deactivateDuplicate); $_SESSION['sql'] = "SELECT id, name, documentType, type, size, networkKey, modifiedBy, modifiedDate, active FROM upload WHERE active = '1'"; $_SESSION['uploadSearch'] = 1; $_SESSION['updateRow'] = 0; } $values = "'".$fileName."','".$docType."','".$fileType."','".$content."','".$fileSize."','".$netKey."','".strtoupper($_SERVER['REMOTE_USER'])."', Now(), 1"; $sqlUpload = "INSERT INTO upload (name, documentType, type, content, size, networkKey, modifiedBy, modifiedDate, active) VALUES (".$values.")"; $dbh->query($sqlUpload); $_SESSION['sql'] = "SELECT id, name, documentType, type, size, networkKey, modifiedBy, modifiedDate, active FROM upload WHERE active = '1'"; $_SESSION['uploadSearch'] = 1; } } 

И вот передняя часть приложения показывает, что работает меньший файл, а файл большего размера – нет. Файл sample.pdf меньше 1 МБ, а файл test.pdf – 2,5 МБ.

http://www.imagechicken.com/viewpic.php?p=1255628359017775300&x=png

Я бы использовал теги img, но, увы, я новый пользователь и не допускаю.

Следующее, что я буду искать, – это параметр в Apache, который ограничивает размеры файлов. Я новичок в LAMP, поэтому любые советы будут замечательными. благодаря

Возможно, вы столкнулись с ограничениями HTTP-запроса (я думаю, это 4 МБ), или ваш HTTP-запрос может быть отключен. Раньше я сталкивался с этим вопросом. Возможно, вы захотите посмотреть @ ваш файл php.ini для максимального размера загрузки.

Отказ от ответственности: я не разработчик PHP: D

Возможно, вы используете лимит mySQL.

Запустите в mySQL следующее:

 show variables like 'max_allowed_packet' 

Это покажет вам текущую настройку. По умолчанию используется 1047552 байт.

Это можно изменить с помощью файла my.cnf. Просто добавьте

 set-variable = max_allowed_packet=2M 

или какой размер требуется, и перезапустите mySQL.

EDIT :
Как насчет

 <input type="hidden" name="MAX_FILE_SIZE" value="xxx" /> 

Может ли быть частью проблемы?

Поэтому, чтобы воспроизвести все, что, как мне кажется, мне пришлось установить, чтобы разрешить загрузку файлов> 1 МБ на то, над чем я работал:

php.ini

  • Изменено post_max_size (я хотел загрузить 15MB-файлов, поэтому я установил его на 20M всякий случай)
  • Изменено upload_max_filesize до 15M
  • Влево max_execution_time на 60
  • Левый max_input_time на 60
  • Левый default_socket_timeout на 60

my.ini

  • Изменено max_allowed_packet до 15M

PHP-код

  • изменил мой вызов PDO на:

    new PDO("mysql:host=$host;dbname=$db_name", $db_username, $db_password, array (PDO::MYSQL_ATTR_MAX_BUFFER_SIZE=>15*1024*1024))

Я действительно исправил проблему. Я изменил все значения, которые были рекомендованы здесь в php.ini и my.cnf, но мне также необходимо было изменить параметр для PDO.

Я изменил: PDO :: MYSQL_ATTR_MAX_BUFFER_SIZE (целое число) Максимальный размер буфера. По умолчанию используется 1 MiB.

Это должно быть установлено, когда объект PDO создан для работы. Все хорошо сейчас.

Если вы пытаетесь сделать это на общем хостинге (там, где вы не можете вносить изменения в файлы конфигурации MySQL и т. Д.), Google «mysqli подготовил заявления».

Это позволяет загружать большие запросы в предопределенные байтовые куски, обходя любые ограничения буфера.