Язык
Контакты
GitHub
Поддержка
Регистрация
Войти
Логин: Пароль: Запомнить:
Пользователи
Последние сообщения
Ответить
1

Загрузка картинки

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#1
В этой теме я расскажу как загружать изображения на сервер и проводить необходимые проверки. Многие могут сказать, что нет ничего проще, но тут я могу поспорить, так как не раз видел, как даже опытные программисты, допускают ошибки. А ошибки эти довольно тривиальны - проверяем размер и расширение и, если все ОК, заливаем. Вроде, все класс, но подумайте что произойдет, если в дальнейшем, Вам надо выводить картинку в натуральную величину ( а так, за частую и происходит ) на страницах сайта. "Ну мы же проверили размер" - скажете Вы. Постойте, мы проверили вес картинки - память, которую она занимает, но мы не проверили ее размер. Ыч, вот вам и лажа. Я например могу сделать картинку, которая будет иметь гиганский размер в пикселях и при этом весить понты. Ну что же, раз сомнений в том, что загрузка картинки не такое уж и плевое дело, не осталось, погнали....

Приведу сразу код, да в нем наме.. птьфу ты.. комментарии...



 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 
 41 
 42 
 43 
 44 
 45 
<?php //проверяем есть ли вообще файл в пост данных
if (!empty($_FILES['image']['name'])) {
    
//выковыриваем расширение файла
    
$ext strrchr$_FILES['image']['name'], "." );
    
//массив допустимых расширений
    
$extensions = array( ".jpg"".gif"".bmp"".png" );
    
//если расширение файла не входит в список допустимых выдаем ошибку
    
if (!in_array($ext$extensions)) {
        die(
'недопустимый формат файла картинки');
    }
    
//Размер файла не должен превышать 100000 байт. Вы можете установить любой размер
    
if ($_FILES['image']['size'] > 100000) {
        die(
'размер файла аватора больше 100 Кб');
    }
    
//генерируем случайный ключ, который будет именем нашего временного файла
    
$tmp_key rand(09999999);
    
//копируем полученный в посте файл во временную директорию
    
if (move_uploaded_file($_FILES['image']['tmp_name'], 'tmp/' $tmp_key '.jpg')) {
        
//устанавливаем права на файл для работы с ним
        
chmod('tmp/' $tmp_key '.jpg'0644);
        
//получаем размеры файла в пикселях. собака для того чтобы юзер если что не так не увидел ошибки
        
@$sizes getimagesize('tmp/' $tmp_key '.jpg');
        if (
$sizes) {
            
//если одна из сторон больше чем 100px выдаем ошибку. Вы можете установить любые размеры
            
if ($sizes[0] > 100 || $sizes[1] > 100) {
                die(
'Размер картинки превышает 100х100 px.');
            }
        } else {
            
//если мы не смогли получить размер значит что то с картинкой не так - это тоже приравниваем к ошибке
            
die('Неопределенная ошибка при обработке картинки.');
        }
    } else {
        
//и если мы ее не смогли скопировать - то же
        
die('Неопределенная ошибка при обработке картинки.');
    }
}


//копируем картинку в постоянную директорию
if (copy('tmp/' $tmp_key '.jpg''img/' $_FILES['image']['name'] . '.jpg')) {
    
//не забываем поставить права
    
chmod('img/' $_FILES['image']['name'] . '.jpg'0644 );
}
//удаляем временную картинку
unlink('tmp/' $tmp_key '.jpg');?>

Вы, наверное, заметили, что я копировал картинку во временное хранилище. Это делалось, потому, что узнать ее размер в пикселях, нельзя иначе. Может именно по этому многие не делают этой проверки:)

Ну вот, в принципе, и все. Думаю доработать этот скрипт Вам не составит труда. Например можно сделать автоматическое изменение размера и тогда Вам будет по барабану какую картинку Вам суют - она все равно уменьшиться до нужных размеров. А можно еще немного по гемороиться и сделать это уменьшение пропорциональным и тогда картинка при уменьшении не будет расплываться и коситься.

Отредактировано автором 15 Июн 2010
Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

skad0

  • Атом-мозг
  • Юзер
  • 841
  • Репутация:10 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#2
Дрюнь. А как вывести картинки? Ну в плане, я загрузил на сервер 5 картинок и мне нужно выводить их в галерее. Что надо сделать?

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#3
Ну вообще самый простой способ это тегом IMG
<img src="путь к картинке" />

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

skad0

  • Атом-мозг
  • Юзер
  • 841
  • Репутация:10 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#4
а способы ещё есть? О_о

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#5
ну можно чисто пыхой вывести. Послать заголовок и затем просто выдать содержимое файла картинки.
 1 
 2 
<?php Header('Content-Type: image/jpeg');
echo 
file_get_contents('путь');?>

Добавлено 2011.01.11 11-58

но тогда на экран нельзя будет выести больше ничего. Тоесть каждую картинку выводим так, но по отдельности. И остальной контент тоже отдельно.

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

skad0

  • Атом-мозг
  • Юзер
  • 841
  • Репутация:10 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#6
Не, так не удобно)

1
Сейчас online: 32. Зарегистрированных: 2. Гостей: 30.