Как я могу вставить большие файлы в базу данных MySQL с помощью PHP?

StackOverflow https://stackoverflow.com/questions/492549

  •  20-08-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Мы делаем это для изображений / PDF-файлов / MPEG-файлов и т.д. В CMS, с которой мы работаем, создавая папку для файла с именем, указанным в имени файла, защищенном от URL, и сохраняя имя папки в базе данных.Тогда легко просто записать его URL-адрес на уровне презентации.

Другие советы

Вы захотите проверить значение конфигурации MySQL "max_allowed_packet", которое может быть установлено слишком маленьким, предотвращая ВСТАВКУ (которая сама по себе большая).

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

mysql> show variables like 'max_allowed_packet';

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

MySQL max_allowed_packet максимальный разрешенный пакет

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

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

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

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

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

Вы могли бы использовать MySQL's Функция LOAD_FILE ( ЗАГРУЗКА файла ) чтобы сохранить файл, но вы все равно должны соблюдать значение max_allowed_packet и тот факт, что файл должен находиться на том же сервере, что и экземпляр MySQL.

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

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

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

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

Что ж, у меня та же проблема.И данные не могут быть введены в базу данных mysql последовательно в "режиме ввода-вывода"

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

Решение, по-видимому, заключается в создании таблицы с большими двоичными объектами, состоящими из нескольких частей, например создайте таблицу data_details ( идентификатор int pk авто_инкремент, chunck_number int не равен нулю, Большой двоичный объект dataPart );???

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top