Как я могу вставить большие файлы в MySQL DB, используя PHP? - PullRequest
7 голосов
/ 29 января 2009

Я хочу загрузить большой файл размером до 10 МБ в мою базу данных MySQL. Используя .htaccess, я изменил собственный предел загрузки файлов PHP на «10485760» = 10 МБ. Я могу загружать файлы размером до 10 МБ без каких-либо проблем.

Но я не могу вставить файл в базу данных, если его размер превышает 1 МБ.

Я использую file_get_contents, чтобы прочитать все данные файла и передать их в запрос на вставку в виде строки для вставки в поле LONGBLOB.

Но файлы размером более 1 МБ не добавляются в базу данных, хотя я могу использовать print_r($_FILES), чтобы убедиться, что файл загружен правильно. Мы будем благодарны за любую помощь, и она понадобится мне в течение следующих 6 часов. Так что, пожалуйста, помогите!

Ответы [ 7 ]

13 голосов
/ 29 января 2009

Вы захотите проверить значение конфигурации MySQL "max_allowed_packet", которое может быть установлено слишком маленьким, чтобы не допустить INSERT (который сам по себе большой).

Запустите следующее из командной строки mysql:

mysql> show variables like 'max_allowed_packet';

Убедитесь, что он достаточно большой. Для получения дополнительной информации об этом параметре конфигурации см.

MySQL max_allowed_packet

Это также влияет на mysql_escape_string () и mysql_real_escape_string () в PHP, ограничивая размер создания строки.

7 голосов
/ 29 января 2009

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

Мы делаем это для images / pdfs / mpegs и т. Д. В CMS, которую мы имеем на работе, создавая папку для файла, названного из url-safe filename и сохраняя имя папки в базе данных. Тогда просто записать его URL на уровне представления.

4 голосов
/ 29 января 2009

Лучший ответ - использовать реализацию, которая лучше и также обходит эту проблему. Вы можете прочитать статью здесь . Храните 10 МБ, 1000 МБ, не имеет значения. Реализация разбивает на части / разбивает файл на множество мелких частей и сохраняет их в нескольких строках. Это помогает с загрузкой и извлечением, поэтому память также не становится проблемой.

3 голосов
/ 29 января 2009

Некоторые расширения PHP для MySQL имеют проблемы с типами данных LONGBLOB и LONGTEXT. Расширения могут не поддерживать потоковую передачу больших двоичных объектов (отправка большого двоичного объекта за раз), поэтому они должны публиковать весь объект за один раз.

Так что, если ограничение памяти PHP или ограничение размера пакета MySQL ограничивают размер объекта, который вы можете публиковать в базе данных, вам может потребоваться изменить некоторую конфигурацию на PHP или MySQL, чтобы разрешить это.

Вы не сказали, какое расширение PHP вы используете (их как минимум три для MySQL), и вы не показали никакого кода, который вы используете для отправки большого двоичного объекта в базу данных.

2 голосов
/ 29 января 2009

Вы можете использовать функцию MySQL LOAD_FILE для хранения файла, но вам все равно необходимо соблюдать значение max_allowed_packet и тот факт, что файл должен находиться на том же сервере, что и экземпляр MySQL.

0 голосов
/ 06 июня 2015

Вы не говорите, какую ошибку получаете (используйте mysql_error (), чтобы выяснить это), но я подозреваю, что вы достигли максимального размера пакета.

Если это так, вам нужно изменить конфигурацию MySQL max_allowed_packet

Ну, у меня та же проблема. И данные не могут быть введены в chunck базы данных mysql chunck в «режиме io»

loop for : 
   read $data from file,
   write $data to blob
end loop
close file
close blob

Похоже, решение заключается в создании таблицы с множественными частями, такими как создать таблицу data_details ( id int pk auto_increment, chunck_number int не нуль, dataPart blob ); ???

0 голосов
/ 29 января 2009

Вы не говорите, какую ошибку получаете (используйте mysql_error(), чтобы узнать), но я подозреваю, что вы достигли максимального размера пакета.

Если это так, вам нужно изменить конфигурацию MySQL max_allowed_packet

...