Сохранить изображение как blob и отобразить в html

Я столкнулся с проблемой при создании сайта.

  • язык: php, js, html
  • СУБД: mysql

Что я пытаюсь сделать

  1. загрузить аватар пользователя (изображение) из базы данных, которая хранится в виде большого двоичного объекта в записи пользователя
  2. заставить его отображаться на моей веб-странице html

На веб-сайте:

  1. загрузка пользователем изображения в качестве аватара достигается путем
<input id = "avatar" type = "file" />
const avatar = document.getElementById('avatar');

$.ajax({
    url: '../php/action.php',
    method: 'POST',
    data: `image=${avatar.value}&action=uploadAvatar`
});
  1. в пользовательском классе
class User{ 
    protected $id;
    protected $avatar; // blob
    // ...

    function setId($id) { $this->id = $id; }
    function getId() { return $this->id; }
    function setAvatar($avatar) { $this->avatar = $avatar; }
    function getAvatar() { return $this->avatar; }
    // ...
}
  1. аватар сохраняется только при создании записи. какой пользователь может установить аватар только при регистрации.
function dummy_user($image){
    $user1 = new User(); 
    $user1->setAvatar($image);
    // ...
}

dummy_user($_POST['image']);

в пользовательском классе sql анализируется и выполняется как:


$sql = "INSERT INTO `user` (`id`, `avatar` ...) VALUES ('" . strval($this->getId()) . "', '" . $this->getAvatar() . " ... ')";
// some other values are omitted by ellipsis 

  1. загрузить запись из базы данных
// exceptions and error handling are omitted
$stmt = $this->conn->prepare('SELECT * FROM `user` WHERE id = ' . strval($id) . '');
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
  1. однако для результата, собранного в javascript
$.ajax({
    url: '../php/action.php',
    method: 'POST',
    data: "id=1&action=loadUser"
}).done(function(result){
    var res = JSON.parse(result);
    console.info(res);
});

Я получаю это:

{"id":"1","avatar":"C:fakepathhusky.png" ...}

есть несколько вещей, о которых стоит упомянуть:

  • Поле аватара таблицы пользователя базы данных установлено как большой двоичный объект. Начальный размер изображения перед загрузкой 349kb

  • после загрузки в базу данных большой двоичный объект становится 19b

  • название изображения: husky.png

  1. чтобы отобразить изображение на html-странице
// result collected from php by ajax
var res = JSON.parse(result);
let img = document.createElement('img');
img.setAttribute('src', 'data:image/png;base64,' + btoa(res.avatar));

Я закончил с неудачей. Ожидаемый результат - получить изображение, отображаемое на странице html. Любое предложение будет оценено.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
172
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Может это поможет. Это нужно для хранения изображения в виде большого двоичного объекта в mysql и отображения.

Ответ принят как подходящий

Вы не можете загрузить файл с помощью Ajax, вы можете загружать файлы с помощью Ajax только через formdata

Оберните ввод файла тегом формы следующим образом:

<form id = "avatar">
<input name = "image" type = "file" />
</form>

Перепишите код Ajax следующим образом:

const form = document.getElementById('avatar');
const formdt = new FormData(form);

$.ajax({
url: '../php/action.php',
method: 'POST',
data: formdt,
processData: false, 
contentType: false
})

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