Я столкнулся с проблемой при создании сайта.
- язык: php, js, html
- СУБД: mysql
Что я пытаюсь сделать
На веб-сайте:
<input id = "avatar" type = "file" />
const avatar = document.getElementById('avatar');
$.ajax({
url: '../php/action.php',
method: 'POST',
data: `image=${avatar.value}&action=uploadAvatar`
});
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; }
// ...
}
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
// 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);
$.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
// 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. Любое предложение будет оценено.
Может это поможет. Это нужно для хранения изображения в виде большого двоичного объекта в 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
})