Я разрабатываю 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 МБ на то, над чем я работал:
post_max_size
(я хотел загрузить 15MB-файлов, поэтому я установил его на 20M
всякий случай) upload_max_filesize
до 15M
max_execution_time
на 60
max_input_time
на 60
default_socket_timeout
на 60
max_allowed_packet
до 15M
изменил мой вызов 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 подготовил заявления».
Это позволяет загружать большие запросы в предопределенные байтовые куски, обходя любые ограничения буфера.