Не получается передать файл в БД (longblob)

Пользователь

от berilloda , в категории: PHP , 9 месяцев назад

Всем привет, столкнулся с такой проблемой. Я написал сайт на 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();



Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

7 ответов

Пользователь

от jaren , 9 месяцев назад

@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'); 

Пользователь

от Ekaterina_90 , 9 месяцев назад

@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мегабайт


Пользователь

от berilloda , 9 месяцев назад

@jaren Здравствуйте, у меня эти значения = 200

Пользователь

от berilloda , 9 месяцев назад

@Ekaterina_90 Здравствуйте, у меня получилось передать в БД корректно файл с python, с другого ПК. Поэтому я сомневаюсь, что проблема в настройках MySQL.

Сами настройки я выставил довольно большими.


Пользователь

от berilloda , 9 месяцев назад

Также я пробовал передавать очень маленький текстовый файл, но всё равно не получилочь.

Модули у меня вроде бы тоже все установлены:

[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 , 9 месяцев назад

Также попробовал с сервера передать запрос на другую БД и столкнулся с той же проблемой

Пользователь

от berilloda , 9 месяцев назад

@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, видимо в нём и была ошибка