Всем привет, столкнулся с такой проблемой. Я написал сайт на vps сервере и мне надо передавать в БД аудиофайл. Если я передаю с помощью php, записываются все данные, кроме самого файла.
Я пробовал передавать через python и не столкнулся с такой проблемой, всё корректно передалось.
У меня на стороне сервера в папке audio лежат файлы, которые надо передать в БД.
Файл конфигурации БД (mySQL), Apache и php.ini я настроил на файлы размером до 100Мбайт. И время ожидания выставил большое. Но всё равно не хочет передаваться файл.
Мой код php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// Создаем соединение $conn = new mysqli($host, $user, $password, $dbname); // Проверяем соединение if ($conn->connect_error) { die("Ошибка подключения: " . $conn->connect_error); } // Получаем user_id из cookie $user_id = $_COOKIE['user_id'] ?? null; $path_ = "c:"; $file_status = 1; if (!is_null($user_id) && !empty($files)) { $stmt = $conn->prepare("INSERT INTO tb_files (user_id, name_, path_, file_status, on_file) VALUES (?, ?, ?, ?, ?)"); foreach ($files as $file_name) { $file_path = $directory . $file_name; $file_content = file_get_contents($file_path); $null = NULL; // Для использования в качестве ссылки на переменную с бинарными данными $stmt->bind_param("sssis", $user_id, $file_name, $path_, $file_status, $null); $stmt->send_long_data(4, $file_content); // Отправляем содержимое файла $stmt->execute(); } echo "Записи успешно добавлены."; } else { echo "Нет данных для добавления."; } $stmt->close(); $conn->close(); |
@berilloda Проблема, с которой вы сталкиваетесь, скорее всего, связана с ограничениями PHP на размер передаваемых данных. По умолчанию PHP имеет ограничение на размер загружаемого файла (обычно 2МБ).
Попробуйте изменить настройки PHP для увеличения лимита размера загружаемых файлов. Для этого вы можете изменить параметры в файле php.ini или динамически в вашем скрипте PHP с помощью функции ini_set()
.
Пример изменения параметров php.ini:
1 2 |
upload_max_filesize = 100M post_max_size = 100M |
Пример изменения параметров в коде PHP:
1 2 |
ini_set('upload_max_filesize', '100M'); ini_set('post_max_size', '100M'); |
@berilloda Проверьте параметр max_allowed_packet в MySQL. Насколько большой файл у Вас ?
попробуйте
1
|
mysqld --max_allowed_packet=128M
|
или обновите конфигурационный файл my.cnf или my.ini (в зависимости от версии) и добавьте:
1 2 |
[mysqld] max_allowed_packet=128M |
или выполните запрос
1
|
SET GLOBAL max_allowed_packet = 134217728; // 128мегабайт |
@Ekaterina_90 Здравствуйте, у меня получилось передать в БД корректно файл с python, с другого ПК. Поэтому я сомневаюсь, что проблема в настройках MySQL.
Сами настройки я выставил довольно большими.
Также я пробовал передавать очень маленький текстовый файл, но всё равно не получилочь.
Модули у меня вроде бы тоже все установлены:
[PHP Modules]
calendar
Core
ctype
date
exif
FFI
fileinfo
filter
ftp
gettext
hash
iconv
json
libxml
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
Phar
posix
readline
Reflection
session
shmop
sockets
sodium
SPL
standard
sysvmsg
sysvsem
sysvshm
tokenizer
Zend OPcache
zlib
@berilloda Я смог решить проблему. Поменял подход при передаче данных:
$stmt = $conn->prepare("INSERT INTO tb_files (user_id, name_, path_, file_status, on_file) VALUES (?, ?, ?, ?, FROM_BASE64(?))");
foreach ($files as $file_name) {
$file_path = $directory . $file_name;
$file_content = file_get_contents($file_path);
$encoded_content = base64_encode($file_content);
$stmt->bind_param("sssis", $user_id, $file_name, $path_, $file_status, $encoded_content);
$stmt->execute();
}
Я отказался от NULL, видимо в нём и была ошибка