Загрузка изображений в MySQL (blob) с PHP - PullRequest
0 голосов
/ 20 июня 2020

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

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

в php .ini

file_uploads = On

Во внешнем интерфейсе

<form enctype="multipart/form-data" method="post" autocomplete="on" action="upload/">       
    <p>
        <input type="file" id="avatar" name="avatar" accept="image/png, image/jpeg" required />
        <label for="avatar">*Profile photo</label>

    </p>

    <p class="submitter two-thirds columns">
        <input type="submit" value="Apply" />
    </p>
     
</form>

В бэкэнде

if(isset($_SESSION['id']))
    $UserID = $_SESSION['id'];
else exit(1);

if (!empty($_FILES['avatar'])){
    $photo = fopen($_FILES['avatar']["tmp_name"], 'rb');
    $photo_mime = $_FILES['avatar']["type"]; 
}
else exit(1);

$values_data = array(
    $UserID,
    $photo,
    $photo_mime,
);


$sql = "INSERT INTO `user`
    (
        UserID,
        photo,
        photo_mime
    )
    VALUES
    (
        :UserID,
        :photo,
        :photo_mime
    )
    ON DUPLICATE KEY UPDATE
        photo = :photo,
        photo_mime = :photo_mime
    ";

$sth = $dbh->prepare($sql);


$sth->bindValue(':UserID', $values_data[0]);
$sth->bindValue(':photo', $values_data[1]);
$sth->bindValue(':photo_mime', $values_data[2]);
$sth->execute();

И база данных получает некоторую информацию

mysql phpmyadmin

Однако все эти двоичные файлы изображений имеют размер 1 КБ. Заглянув внутрь, у них есть такие данные:

Идентификатор ресурса # 13

Итак, двоичные файлы испорчены или сброшены где-то вдоль линии ... но где ?

1 Ответ

2 голосов
/ 20 июня 2020

fopen() не возвращает содержимое файла. Он возвращает ресурс указателя файла, который затем можно передать примерно так: fread () , чтобы получить содержимое.

Что-то вроде:

$handler = fopen($_FILES['avatar']["tmp_name"], 'r');
$file = fread($handler, filesize($_FILES['avatar']["tmp_name"]));
fclose($handler);

Более простой способ будет использовать file_get_contents () :

$file = file_get_contents($_FILES['avatar']["tmp_name"]);

, который даст вам содержимое в одной строке.

...