Не сохраняются картинки на компьюторе

240
26 ноября 2016, 20:21

Подскажите пожалуйста. Это файл обработки картинок. Когда нажимаю сохранить то картинки в БД добавляются, а на компьютер в папку 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>

У меня одна кнопка submit отвечающая за весь профиль

Answer 1

В зависимости от input type='file'.

Как я понял, есть возможность выбрать только 1 файл для загрузки. По этому пример делаю именно для одного файла. Переписал заново, чуть изменил названия переменных и кое-что необходимое добавил.

Еще проверь аттрибут формы: enctype="multipart/form-data", добавь если нету.

$uploadFolder = Папка в которую грузят аватарки
$fileArray = это твой глобальный массив $_FILES['fupload'];
$defaultAvatar = Стандартная аватарка
$newAvatar = Новая аватарка, которая прошла все процедуры
$AllowedExtensions = допустимые расширения загружаемых файлов
$imageFormat = формат изображения для `imagecreatefrompng` или `imagecreatefromjpeg`
$maxSize = Максимальный размер загружаемого файла
$error = Массив ошибок который возвращается в случае несоответствия необходимым условиям

Проверки:

  1. Авторизован ли пользователь
  2. Выбран ли файл. Если не выбран, возвращает код ошибки 4
  3. Проверяет MIME тип изображения. Ты проверял через название файла, так не годится.
  4. Проверяет размер файла. Можешь себе его изменить, но вряд ли на хостинге разрешают размер больше.\
  5. Если в массиве $error что-то есть, возвращает массив. Может его себе потом распечатать (print_r)
  6. Проверяем загружен ли временный файл, если да, то продолжаем операции
  7. Проверяем существует ли папка для загрузки аватаров
  8. Перемещаем загруженый файл
  9. После всех уменьшений и всё такое, проверяем наличие нового изображения в папке
  10. Выбираем из БД название старого аватара и пытаемся удалить
  11. Если по какой-то причине нет имени нового аватара, будет установлен стандартный
  12. Если всё прошло успешно, пишем что мы молодцы, аватарка загружени.Пляшем и танцуем.

Теперь сам код

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(); // Перезагрузка страницы, чтобы данные с формы случайно не отправились еще раз
}
READ ALSO
SQL Select больше или равно

SQL Select больше или равно

Здравствуйте! Помогите пожалуйста разобраться Есть таблица со колонкой price (тип int) в ней записи 50, 75, 100

345
Подключение к MySQL вопрос на тему порта

Подключение к MySQL вопрос на тему порта

Добрый день! Возникла необходимость отловить неправильно введённые url\port\login\password для подключения к БД и выводить соответствующие сообщения...

258
Что значит режим MySQL &ldquo;NO_AUTO_VALUE_ON_ZERO&rdquo;?

Что значит режим MySQL “NO_AUTO_VALUE_ON_ZERO”?

Что значит режим MySQL NO_AUTO_VALUE_ON_ZERO?

247