Загрузка изображения в профиль
Пробую сделать загрузку изображения пользователя на аву,но столкнулся с проблемой. Выводится не картинка,а сам массив с данными о изображении внутри которые он содержит : Array ( [file] => Array ( [name] => unnamed.jpg [type] => image/jpeg [tmp_name] => W:\userdata\php_upload\php4F17.tmp [error] => 0 [size] => 52308 ) ) 1
То есть я так понимаю сама передача осуществляется,но нет вывода самой картинки и нет добавления ее имени в БД . Зашел в тупик из-за нехватки опыта.Прошу помощи.Спасибо
//dashboard
<p><?=$_FILES['file']?></p>
<form action="/user/dashboard" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Загрузить файл!" class="btn btn-info">
</form>
//UserModel
public function can_upload($file){
$sql = 'INSERT INTO users(image) VALUES(:image)';
$query = $this->_db->prepare($sql);
$sth->execute(['image' => $file['name']]);
// если имя пустое, значит файл не выбран
if($file['name'] == '')
return 'Вы не выбрали файл.';
// if($file['size'] > 50000)
// return 'Файл слишком большой.';
// разбиваем имя файла по точке и получаем массив
$getMime = explode('.', $file['name']);
// нас интересует последний элемент массива - расширение
$mime = strtolower(end($getMime));
// объявим массив допустимых расширений
$types = array('jpg', 'png', 'gif', 'bmp', 'jpeg');
// если расширение не входит в список допустимых - return
if(!in_array($mime, $types))
return 'Недопустимый тип файла.';
return true;
}
public function make_upload($file){
// формируем уникальное имя картинки: случайное число и name
$name = mt_rand(0, 10000) . $file['name'];
move_uploaded_file($file['tmp_name'], 'public/img');
}
//User
public function pic(){
// если была произведена отправка формы
if(isset($_FILES['file'])) {
// проверяем, можно ли загружать изображение
$check = can_upload($_FILES['file']);
if($check === true){
// загружаем изображение на сервер
make_upload($_FILES['file']);
echo "<strong>Файл успешно загружен!</strong>";
}
else{
// выводим сообщение об ошибке
echo "<strong>$check</strong>";
}
}
}
Ответы (1 шт):
Если вкратце, то выгляди так. По сути каждая функция возвращает результат true/false. например ты ожидаешь что файл загрузится move_uploaded_file(), но файл может не загрузиться по нескольким причинам - не хватает прав на запись в папку, папки не существует и тд. То же самое и с базой данных - запись может добавиться в таблицу, а может и не добавиться, может там настроена уникальность имен файлов. Да, очень много проверок в итоге.
dashboard.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/so/dashboard.php" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Загрузить файл!" class="btn btn-info">
</form>
</body>
</html>
dashboard.php
class FileUpload {
private $file;
public function __construct($file) {
$this->file = $file;
}
public function upload() {
if ($this->canUpload()) {
$result = $this->doUpload();
return $result;
}
return false;
}
protected function canUpload() {
//see http://htmlbook.ru/html/value/mime
$types = ['image/jpeg', 'image/png', 'image/bmp', 'image/gif'];
if (!in_array($this->file['type'], $types))
return false;
return true;
}
protected function doUpload() {
$name = mt_rand(0, 10000) . '_' . $this->file['name'];
$this->file['name'] = $name;
$upload_dir = ROOT_DIR . '/uploads/' . $name;
$result = move_uploaded_file($this->file['tmp_name'], $upload_dir);
if ($result) {
$this->insert();
$this->view();
}
return $result;
}
protected function insert() {
//$sql = 'INSERT IGNORE INTO users (image) VALUES (:image)';
//$sth = $this->_db->prepare($sql);
//$result = $sth->execute([':image' => $this->file['name']]);
//return $result;
}
protected function view() {
$url = DOMAIN . '/uploads/' . $this->file['name'];
echo '<img src="' . $url . '" width="300px" />';
echo '<a href="../so/dashboard.html">взад</a>';
}
}
const DOMAIN = '/so/';
const ROOT_DIR = __DIR__;
if (isset($_FILES['file']) && !empty($_FILES['file']['name'])) {
$f = new FileUpload($_FILES['file']);
$f->upload();
} else {
echo 'файл пока не был выбран <a href="../so/dashboard.html">взад</a>';
}