Подскажите пожалуйста. Это файл обработки картинок. Когда нажимаю сохранить то картинки в БД добавляются, а на компьютер в папку avatars не добавляется. В связи этим не отображается аватарка. В чем может быть проблема?
<?php
session_start(); // сессия
// проверяем - запрос пришел при авторизованной сессии или нет?
if ($_SESSION['auth'] == 'yes_auth') {
if (isset($_FILES['fupload']['name'])){ //отправлялась ли переменная
if (empty($_FILES['fupload']['name']) AND $_FILES['fupload']['name'] == ''){
$noAvatar = "avatar.png";//изображение если пользователь не загрузил свое
$result = mysql_query("SELECT avatar FROM reg_user WHERE login='$login'");//извлекаем текущий аватар
$avatarka = mysql_fetch_array($result);
if ($avatarka['avatar'] != $noAvatar) {//если аватар был стандартный, то не удаляем его, ведь у на одна картинка на всех.
unlink ('../avatars/'.$avatarka['avatar']);
}
}
else{
//иначе - загружаем изображение пользователя для обновления
$path_to_90_directory = '../avatars/';//папка, куда будет загружаться начальная картинка и ее сжатая копия
if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)|(png)|(PNG)$/',$_FILES['fupload']['name']))//проверка формата исходного изображения
{
$filename = $_FILES['fupload']['name'];
$source = $_FILES['fupload']['tmp_name'];
$target = $path_to_90_directory . $filename;
move_uploaded_file($source, $target);//загрузка оригинала в папку $path_to_90_directory
if(preg_match('/[.](PNG)|(png)$/', $filename)) {
$im = imagecreatefrompng($path_to_90_directory.$filename) ;//если оригинал был в формате png
}
if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/', $filename)) {
$im = imagecreatefromjpeg($path_to_90_directory.$filename); //если оригинал был в формате jpg
}
//СОЗДАНИЕ КВАДРАТНОГО ИЗОБРАЖЕНИЯ И ЕГО ПОСЛЕДУЮЩЕЕ СЖАТИЕ
$w = 150; // ширина изображения
$quality = 147; //Качество создаваемого изображения max 100
$w_src = imagesx($im); //вычисляем ширину
$h_src = imagesy($im); //вычисляем высоту изображения
//Создавать квадратное изображение $rezim = 1
//Создать изображение пропорционально оригиналу $rezim = 2
$rezim = 1;
switch ($rezim){
//**************************** 1
case "1" :
// создаём пустую квадратную картинку
// важно именно truecolor!, иначе будем иметь 8-битный результат
$dest = imagecreatetruecolor($w,$w);
// вырезаем квадратную серединку по x, если фото горизонтальное
if ($w_src > $h_src){
imagecopyresampled($dest, $im, 0, 0, round((max($w_src,$h_src)-min($w_src,$h_src))/2), 0, $w, $w, min($w_src,$h_src), min($w_src,$h_src));
}
// вырезаем квадратную верхушку по y,
if ($w_src < $h_src){
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, min($w_src,$h_src), min($w_src,$h_src));
}
// квадратная картинка масштабируется без вырезок
if ($w_src == $h_src){
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $h_src);
}
break;
//***************************** 2
case "2" :
$prop = $w_src/$h_src;
$h = $w/$prop;
$dest = imagecreatetruecolor($w,$h);
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $h, $w_src, $h_src);
break;
}
$random = rand(1000000, 9999999);
imagejpeg($dest, $path_to_90_directory.$random.".jpg", $quality);//сохраняем изображение формата jpg в нужную папку
$avatar = $random.".jpg";//заносим в переменную путь до аватара.
$delfull = $path_to_90_directory.$filename;
unlink ($delfull);//удаляем оригинал загруженного изображения, он нам больше не нужен.
$result = mysql_query("SELECT avatar FROM reg_user WHERE login='$login'");//извлекаем текущий аватар пользователя
$avatarka = mysql_fetch_array($result);
if ($avatarka['avatar'] != $noAvatar) {//если аватар был стандартный, то не удаляем его, ведь у на одна картинка на всех.
unlink ('../avatars/'.$avatarka['avatar']);
}
}
else{
//в случае несоответствия формата, выдаем соответствующее сообщение
exit ("Аватар должен быть в формате <strong>JPG или PNG</strong>");
}
}
$up = mysql_query("UPDATE reg_user SET avatar='$avatar' WHERE login='$login'");//обновляем аватар в базе
if ($up == true) {//если верно, то отправляем на личную страничку
echo "<meta http-equiv='Refresh' content='0; URL=profile.php?login=".$login."'>";
}
}
} else
die("Авторизуйтесь или зарегистрируйтесь");
?>
<form method="post">
<?php
echo "<img src='avatars/".$avatar."'> <br><br>";
?>
<table width="600" border="0">
<tr>
<td> Изменить аватар </td>
<td>
<form action='include/save_avatar.php' method='post' enctype='multipart/form-data'>
<input type="file" name="fupload" id="fupload" size='8'>
</form>
</td>
</tr>
</table>
<ul id="info-profile">
<li>
<label for="info_surname">Фамилия</label>
<span class="star"></span>
<input type="text" name="info_surname" id="info_surname" value="<?php echo $_SESSION['auth_surname']; ?>" />
</li>
//дальше имя телефон и так далее
<p align="right"><input type="submit" id="form_submit2" name="save_submit2" value="Сохранить" /></p>
<form>
В зависимости от input type='file'
.
Как я понял, есть возможность выбрать только 1 файл для загрузки. По этому пример делаю именно для одного файла. Переписал заново, чуть изменил названия переменных и кое-что необходимое добавил.
Еще проверь аттрибут формы: enctype="multipart/form-data"
, добавь если нету.
$uploadFolder = Папка в которую грузят аватарки
$fileArray = это твой глобальный массив $_FILES['fupload'];
$defaultAvatar = Стандартная аватарка
$newAvatar = Новая аватарка, которая прошла все процедуры
$AllowedExtensions = допустимые расширения загружаемых файлов
$imageFormat = формат изображения для `imagecreatefrompng` или `imagecreatefromjpeg`
$maxSize = Максимальный размер загружаемого файла
$error = Массив ошибок который возвращается в случае несоответствия необходимым условиям
Проверки:
Теперь сам код
function updateUserAvatar($login) {
$link = mysqli_connect("localhost", "user", "password", "db_name") or die(mysqli_error($link));
$uploadFolder = $_SERVER['DOCUMENT_ROOT'] . '/avatars/';
$fileArray = $_FILES['fupload'];
$defaultAvatar = 'avatar.png';
$newAvatar = NULL;
$AllowedExtensions = ['image/jpeg', 'image/png'];
$imageFormat = '';
$maxSize = 1024 * 1024 * 15;
$error = [];
// Проверка 1
if (!isset($_SESSION['auth']) && $_SESSION['auth'] != 'yes_auth')
$error[] = 'Пройдите авторизацию чтобы изменить аватар';
// Проверка 2
if ($fileArray['error'] == 4)
$error[] = 'Вы не выбрали изображение для загрузки';
// Проверка 3
if ($fileArray['tmp_name']) {
$info = finfo_open(FILEINFO_MIME_TYPE); //открываем изображение
if (!in_array(finfo_file($info, $fileArray['tmp_name']), $AllowedExtensions))
$error[] = "Допустимый формат изображения: JPG, JPEG, PNG";
else
$imageFormat = finfo_file($info, $fileArray['tmp_name']);
if ($imageFormat == 'image/jpeg') $imageFormat = 'jpeg';
else $imageFormat = 'png';
finfo_close($info);
}
// Проверка 4
if ($fileArray['size'] > $maxSize)
$error[] = "Максимальный размер файла: 15MB";
// Проверка 5
if ($error) {
return $error;
} else {
// Проверка 6
if (is_uploaded_file($fileArray['tmp_name'])) {
$extension = explode('.', $fileArray['name']);
$extension = '.' . end($extension);
$fileArray['name'] = md5(rand(10, 99) . time() . $fileArray['name']) . $extension;
$filePath = $uploadFolder . $fileArray['name'];
// Проверка 7
if (!file_exists($uploadFolder)) mkdir($uploadFolder, 0777, true);
// Проверка 8
if (move_uploaded_file($fileArray['tmp_name'], $filePath)) {
$im = NULL;
$destinationImage = NULL;
if ($imageFormat == 'png') $im = imagecreatefrompng($filePath);
if ($imageFormat == 'jpeg') $im = imagecreatefromjpeg($filePath);
$width_original = imagesx($im); //Ширину оригинала
$height_original = imagesy($im); //Высота оригинала
$width_new = 150; //Ширина нового изображения
$quality = 147; //Качество нового изображения max 100
$resizeForm = 1; //1 - Квадратное изображение; 2 - Пропорционально оригиналу;
switch ($resizeForm):
case 1:
$destinationImage = imagecreatetruecolor($width_new, $width_new);
if ($width_original > $height_original)
imagecopyresampled($destinationImage, $im, 0, 0,
round((max($width_original, $height_original) - min($width_original, $height_original)) / 2),
0, $width_new, $width_new,
min($width_original, $height_original), min($width_original, $height_original));
if ($width_original < $height_original)
imagecopyresampled($destinationImage, $im, 0, 0, 0, 0, $width_new, $width_new,
min($width_original, $height_original), min($width_original, $height_original));
if ($width_original == $height_original)
imagecopyresampled($destinationImage, $im, 0, 0, 0, 0, $width_new, $width_new, $width_original, $height_original);
break;
case 2:
$prop = $width_original / $height_original;
$height_new = $width_new / $prop;
$destinationImage = imagecreatetruecolor($width_new, $height_new);
imagecopyresampled($destinationImage, $im, 0, 0, 0, 0, $width_new, $height_new, $width_original, $height_original);
break;
endswitch;
$resizeFileName = md5(time() . (rand(1, 30) + rand(31, 62))) . '.jpg';
$resizeFilePath = $uploadFolder . $resizeFileName;
imagejpeg($destinationImage, $resizeFilePath, $quality);
// Проверка 9
if (file_exists($resizeFilePath)) {
unlink($filePath);
$newAvatar = $resizeFileName;
// Проверка 10
$oldAvatarDelete = "SELECT avatar FROM reg_user WHERE login = '$login' LIMIT 1";
$oldAvatarResult = mysqli_query($link, $oldAvatarDelete) or die(mysqli_error($link));
$oldAvatarArray = mysqli_fetch_array($oldAvatarResult);
$oldAvatar = $oldAvatarArray['avatar'];
$oldAvatarPath = $uploadFolder . $oldAvatar;
if (file_exists($oldAvatarPath))
unlink($oldAvatarPath);
}
}
}
// Проверка 11
if (!$newAvatar) $newAvatar = $defaultAvatar;
$updateQuery = "UPDATE reg_user SET avatar = '$newAvatar' WHERE login = '$login'";
$resultUpdate = mysqli_query($link, $updateQuery) or die(mysqli_error($link));
// Проверка 12
if (mysqli_affected_rows($link) > 0)
echo 'Аватар успешно загружен';
else return false;
return true;
}
}
Надеюсь разберешься. Тогда старался и трудился не зря. :)
Функции которые начинаются с mysql_
уже устарели. Их не рекомендуется использовать. Вместо этого используй:
mysqli_connect()
, mysqli_query()
, mysqli_fetch_array
и так далее. Смотри документацию PHP.
UPDATE:
CSS чтобы скучно небыло.
form {
displa: block;
width: 400px;
border: 1px solid #f9b;
box-sizing: border-box;
background-color: #036F96;
}
div {
width: 100%;
padding: 10px 15px;
box-sizing: border-box;
overflow: hidden;
}
div > p {
text-align: center;
box-sizing: border-box;
padding: 5px;
width: 100%;
display: block;
background-color: #96292F;
}
div > img {
max-width: 150px;
display: block;
margin: 5px auto;
background-color: #189659;
}
div > label {
dislay: block;
float: left;
width: 130px;
}
div > input {
display: block;
padding: 5px;
float: left;
width: 200px;
}
div > input[type=submit] {
display: block;
float: none;
margin: 5px auto;
}
<form action="" method="post" enctype="multipart/form-data">
<div>
<?php if(file_exists($_SERVER['DOCUMENT_ROOT'].'/avatars/'.$avatar)): ?>
<img src="<?= $_SERVER['DOCUMENT_ROOT'].'/avatars/'.$avatar ?>" alt="My-Avatar">
<?php else: ?>
<p>У вас еще нет аватарки</p>
<?php endif; ?>
</div>
<div>
<label for="info_surname">Фамилия: </label>
<input type="text" name="info_surname" id="info_surname" value="<?= $_SESSION['auth_surname']; ?>">
</div>
<div>
<label for="info_avatar">Выберите файл:</label>
<input type="file" id="info_avatar" value="" name="fupload">
</div>
<div>
<input type="submit" name="info_edit" value="Сохранить">
</div>
</form><!-- .Конец формы -->
Форму нельзя пихать в еще одну форму. Табличная вёрстка уже отжила свое давным давно. Создавай блочную вёрстку.
Копируешь, и запускаешь это все дело.
Чтобы запустить: Копируешь код который ниже написан. Функция redirect()
для того чтобы после отправки формы, случайно не нажал f5 и те же данные не полетели еще раз в базу.
$login = $_SESSION['auth_surname'];//или где ты там его берешь
function redirect() {
$redirect = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : $_SERVER['REQUEST_URI'];
header("Location: $redirect");
exit;
}
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['info_edit'])){
updateUserAvatar($login);
redirect(); // Перезагрузка страницы, чтобы данные с формы случайно не отправились еще раз
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Здравствуйте! Помогите пожалуйста разобраться Есть таблица со колонкой price (тип int) в ней записи 50, 75, 100
Добрый день! Возникла необходимость отловить неправильно введённые url\port\login\password для подключения к БД и выводить соответствующие сообщения...