Видимо, я вообще не знаю php... (((
Есть простая форма, которая принимает поле из БД, в котором хранится имя файла изображения. Затем, в той же форме выбираем новый файл изображения и копируем его в папку, где хранятся все картинки для сайта.
Приведенные ниже скрипты эту задачу успешно выполняют.
Скрипт самой формы
<form action="img-upload.php" enctype="multipart/form-data" method="POST" name="form_upload">
<?php img_data_read(); ?> // выбираем данные из БД и передаем значение поля в переменную $ImgName - все делает успешно!
<div class="form-group row h-20">
<label for="logo" class="col-2 col-form-label my-auto">Логотип и фавикон сайта</label>
<div id="image" class="col-1 my-auto">
<img class-"img-fluid" src="./images/<?php echo $ImgName; ?>" style="width: 10vh; height: auto;">
</div>
<div class="col-4 my-auto">
<input class="form-control site-name" type="text" name="Logo" value="<?php echo $ImgName; ?>" id="Logo" readonly>
</div>
<div class="col-5 my-auto">
<label><input id="file" name="file" type="file" /></label>
<label><input name="button" type="submit" value="Сохранить" /></label>
</div>
<?php echo "Loaded file name: " . $_FILES['file']['name']; ?>
</div>
Здесь обратите внимание на предпоследнюю строку кода, которая должна бы выводить имя загруженного файла, но не выводит вообще ничего.
Скрипт img-upload.php - action для ^
require 'functions.php';
header('Location: admin.php');
$extensions = array('jpg', 'jpeg', 'png', 'gif'); // массив разрешенных расширений
$upload_dir = 'images'; // папка для загрузки
if(!empty($_POST['button'])) {
$message = uploadHandle(8, $extensions, $upload_dir);
echo $message = $message['error'] ? $message['error'] : $message['info'];
}
header здесь используем для возврата ни страницу инициации скрипта. Вызываемая функция uploadHandle содержится в файле functions.php:
function uploadHandle($max_file_size = 1024, $valid_extensions = array(), $upload_dir = '.') {
$error = null;
$info = null;
$max_file_size *= 1048576; // максимальный размер файла в байтах: 1 048 576 байт = 1 Мб
if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
// проверяем расширение файла
$file_extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
if (in_array(strtolower($file_extension), $valid_extensions)) {
// проверяем размер файла
if ($_FILES['file']['size'] < $max_file_size) {
$file_name = $_FILES['file']['name']; // получаем имя файла
$destination = './' . $upload_dir . '/' . $file_name;
if (move_uploaded_file($_FILES['file']['tmp_name'], $destination)) $info = 'Файл ' . $file_name . ' успешно загружен';
else $error = 'Не удалось загрузить файл';}
else $error = 'Размер файла больше допустимого';}
else $error = 'У файла недопустимое расширение';}
else {
// массив ошибок
$error_values = array(
UPLOAD_ERR_INI_SIZE => 'Размер файла больше разрешенного директивой upload_max_filesize в php.ini',
UPLOAD_ERR_FORM_SIZE => 'Размер файла превышает указанное значение в MAX_FILE_SIZE',
UPLOAD_ERR_PARTIAL => 'Файл был загружен только частично',
UPLOAD_ERR_NO_FILE => 'Не был выбран файл для загрузки',
UPLOAD_ERR_NO_TMP_DIR => 'Не найдена папка для временных файлов',
UPLOAD_ERR_CANT_WRITE => 'Ошибка записи файла на диск');
$error_code = $_FILES['file']['error'];
if (!empty($error_values[$error_code])) $error = $error_values[$error_code];
else $error = 'Случилось что-то непонятное';
}
return array('info' => $info, 'error' => $error);
}
На всяческие проверки можно внимания не обращать, они, в принципе, почти все срабатывают.
Итого, результат: файл выбрали и скопировали в нужную папку.
Задача: заменить (скорее всего нужен ajax) значения переменной $ImgName в