Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Посоветуйте, как упростить код обработки изображения
 
 автор: sega_z   (11.01.2012 в 00:19)   письмо автору
 
 

Это снова я!

В интернете нашел код по обработке и загрузке изображений на сервер + немного подработал сам:


<?php
if (!empty ($_FILES["foto1"]['name']))
{
// Проверка размера файла
if ($_FILES['foto1']['size'] > 10000000) {exit ("<br><span class = 'ohibka'>Размер изображения №1 более 10 Мб.!</span>");}
// Проверяем тип файла
if(!preg_match('/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/',$_FILES['foto1']['name']))//проверка формата исходного изображения
{
exit (
"<br><span class = 'ohibka'>Не верный тип изображения №1!</span>");
}
// Каталог для фото
$catalog "foto/";
$uploadfoto1 $catalog.basename($_FILES['foto1']['name']);
$filename1 $_FILES['foto1']['name'];
// Копируем файл из каталога для временного хранения файлов:
copy($_FILES['foto1']['tmp_name'], $uploadfoto1);
if(
preg_match('/[.](GIF)|(gif)$/',$filename1)) 
{
$im imagecreatefromgif($uploadfoto1) ; //если оригинал был в формате gif, то создаем изображение в этом же формате. Необходимо для последующего сжатия
}
if(
preg_match('/[.](PNG)|(png)$/',$filename1)) 
{
$im imagecreatefrompng($uploadfoto1) ;//если    оригинал был в формате png, то создаем изображение в этом же формате. Необходимо для последующего сжатия
}
if(
preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/',$filename1)) 
{
$im imagecreatefromjpeg($uploadfoto1); //если оригинал был в формате jpg, то создаем изображение в этом же формате. Необходимо для последующего сжатия
}

// Создание маленького изображения №1
$size1 getimagesize($_FILES['foto1']['tmp_name']);
$raznica1 $size1[0]/93//Заданная ширина картинки 100
$w_src1 imagesx($im)/$raznica1//Вычисляем ширину и высоту картинки
$h_src1 imagesy($im)/$raznica1;
$dest1 imagecreatetruecolor($w_src1,$h_src1);           
imagecopyresampled($dest1,$im,0,0,0,0,$w_src1,$h_src1,imagesx($im),imagesy($im));
$date1 microtime(); //вычисляем время в микросекундах в настоящий момент.
imagejpeg($dest1,$catalog.$date1.".jpg");//сохраняем изображение формата jpg в нужную папку, именем будет текущее время. 
Сделаночтобы не было одинаковых имен.          
//почему именно jpg? Он занимает очень мало места + уничтожается анимирование gif изображения, которое отвлекает пользователя. 
Не очень приятно читать его комментарийкогда краем глаза замечаешь какое-то движение
$delful1 
$catalog.$filename1
unlink($delful1);//удаляем оригинал загруженного изображения         
$foto1_mini "$catalog$date1.jpg";//заносим в переменную путь до фото

// Создаём большое изображение №1
$size2 getimagesize($_FILES['foto1']['tmp_name']); // Если ширина картинки больше 500 то уменьшаем ее размер до 500 пикселей, если нет то оставляем размер без изменений
if (($size2[0] > 600))
{
$raznica2 $size2[0]/600//Заданная ширина картинки 500
$w_src2 imagesx($im)/$raznica2//Вычисляем ширину и высоту картинки
$h_src2 imagesy($im)/$raznica2;
$dest2 imagecreatetruecolor($w_src2,$h_src2);           
imagecopyresampled($dest2,$im,0,0,0,0,$w_src2,$h_src2,imagesx($im),imagesy($im));
$date2 microtime();
imagejpeg($dest2,$catalog.$date2.".jpg");
$foto1_big "$catalog$date2.jpg";//заносим в переменную путь до фото.
}
else
{
$w_src2 imagesx($im);
$h_src2 imagesy($im);
$dest2 imagecreatetruecolor($w_src2,$h_src2);           
imagecopyresampled($dest2,$im,0,0,0,0,$w_src2,$h_src2,imagesx($im),imagesy($im));
$date2 microtime();
imagejpeg($dest2,$catalog.$date2.".jpg");
$foto1_big "$catalog$date2.jpg";//заносим в переменную путь до фото.
}
}
?>


Код слишком загружает сервер, особенно когда картинок шесть обрабатывается. Может посоветуйте как его упростить?

Ещё один недостаток: иногда бывает, что картинка не догрузилась в папку foto, а путь к ней прописывается и сохраняется в БД. Затем при выводе изображения выводится содержимое её тега ALT, т.к. самой картинки нет в папке.

Как сделать в этом коде, чтобы путь до фото заносился только в случае успешной загрузки фото?

  Ответить  
 
 автор: Slo_Nik   (11.01.2012 в 01:56)   письмо автору
 
   для: sega_z   (11.01.2012 в 00:19)
 


<?php 
// Проверяем тип файла 
if(!preg_match('/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/',$_FILES['foto1']['name']))//проверка формата исходного изображения 

exit (
"<br><span class = 'ohibka'>Не верный тип изображения №1!</span>"); 

// Я бы посоветовал использовать функцию getimagesize() для проверки типа файла.
// расширение можно подменить, но даже если расширение подменили, функция вернёт false
// если файл не является изображением

// Копируем файл из каталога для временного хранения файлов: 
copy($_FILES['foto1']['tmp_name'], $uploadfoto1); 
// тут я бы порекомендовал использовать move_uploaded_file()
// и проверять, есил функция вернула true , то записывать имя файла в базу
if(move_uploaded_file($_FILES['foto1']['tmp_name'], $uploadfoto1)){
 
// запрос к базе на запись имени файла
}
?>

  Ответить  
 
 автор: sega_z   (11.01.2012 в 16:30)   письмо автору
 
   для: Slo_Nik   (11.01.2012 в 01:56)
 

Благодарю за помощь!!!

  Ответить  
 
 автор: Slo_Nik   (11.01.2012 в 16:41)   письмо автору
 
   для: sega_z   (11.01.2012 в 16:30)
 

не за что благодарить, это только маленькая толика того, что можно поменять в Вашем коде.
например: проверка объёма изображения тоже поменять не мешало бы.

  Ответить  
 
 автор: sega_z   (11.01.2012 в 17:19)   письмо автору
 
   для: Slo_Nik   (11.01.2012 в 16:41)
 

А что там не так?

  Ответить  
 
 автор: Slo_Nik   (11.01.2012 в 17:29)   письмо автору
 
   для: sega_z   (11.01.2012 в 17:19)
 

Я бы сделал так

<?php 
if ($_FILES['foto1']['size'] > 3*1024*1024) {exit ("<br><span class = 'ohibka'>Размер изображения №1 более 3 Мб.!</span>");} 

потому, что 10000000 КБ = 9765.625 МБ , а если будут грузит фото 9,9 мб? вроде не 10, но выдаст ошибку

  Ответить  
 
 автор: sega_z   (11.01.2012 в 17:52)   письмо автору
 
   для: Slo_Nik   (11.01.2012 в 17:29)
 

Да, действительно!

Спасибо!

Только почему то не срабатывает if(move_uploaded_file($_FILES['foto1']['tmp_name'], $uploadfoto1))

Эта работает: if(copy($_FILES['foto1']['tmp_name'], $uploadfoto1))

  Ответить  
 
 автор: Slo_Nik   (11.01.2012 в 18:33)   письмо автору
 
   для: sega_z   (11.01.2012 в 17:52)
 

в чём выражается "не срабатывает"?
начните с error_reporting(E_ALL); пропишите самой первой строчкой в коде.
возможно ошибка в пути к директории для загрузки файлов
или недостаточно прав доступа к директории

<?php 
if(move_uploaded_file($_FILES['foto1']['tmp_name'], $uploadfoto1)){ 
 
// запрос к базе на запись имени файла 
}
else{
 echo 
"Файл не загружен";
}

  Ответить  
 
 автор: sega_z   (11.01.2012 в 18:38)   письмо автору
 
   для: Slo_Nik   (11.01.2012 в 18:33)
 

Путь к файлу заносится в БД, а изображения нет (выдает содержимое тега ALT)
И сообщение об ошибке не выдает.

  Ответить  
 
 автор: Slo_Nik   (11.01.2012 в 18:46)   письмо автору
 
   для: sega_z   (11.01.2012 в 18:38)
 

проверяйте путь к директории

  Ответить  
 
 автор: sega_z   (11.01.2012 в 18:58)   письмо автору
 
   для: Slo_Nik   (11.01.2012 в 18:46)
 

Причем тут путь к директории я ничего не меняю, кроме функции "copy" на "move_uploaded_file".
C функцией copy все нормально, а с другой функцией ...

  Ответить  
 
 автор: SerG7   (11.01.2012 в 19:14)   письмо автору
 
   для: sega_z   (11.01.2012 в 18:58)
 

А имена файлов на каком языке..?не латиница..
Какой протокол или это просто копирование....
мануал гласит...
Описание
bool move_uploaded_file ( string filename, string destination )

Эта функция проверяет, является ли файл filename загруженным на сервер 
(переданным по протоколу HTTP POST). 
Если файл действительно загружен на сервер, он будет перемещён в место, указанное в аргументе destination.

Если filename не является загруженным файлов, никаких действий не предпринимается и move_uploaded_file() возвращает FALSE. 

Описание
bool copy ( string source, string dest )

Создает копию файла, чье имя передано в параметре source, в файле с именем dest. 
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

  Ответить  
 
 автор: sega_z   (11.01.2012 в 19:27)   письмо автору
 
   для: SerG7   (11.01.2012 в 19:14)
 

Т.е. move_uploaded_file() - это вырезать и вставить, а copy() - копировать и вставить?
Имена загружаемых файлов неизвестны, т.к. их загружают пользователи со своих компьютеров и они могут быть разнообразные.

Не понял вопрос: "Какой протокол или это просто копирование...."

  Ответить  
 
 автор: SerG7   (11.01.2012 в 19:40)   письмо автору
 
   для: sega_z   (11.01.2012 в 19:27)
 

move_uploaded_file() работает ТОЛЬКО с файлами загруженными по протоколу HTTP POST

  Ответить  
 
 автор: Slo_Nik   (11.01.2012 в 19:43)   письмо автору
 
   для: SerG7   (11.01.2012 в 19:40)
 

добавлю к вышесказанному.
проверьте атрибут тека form
должно быть так
<form method="post" enctype="multipart/form-data">

  Ответить  
 
 автор: Slo_Nik   (11.01.2012 в 19:34)   письмо автору
 
   для: sega_z   (11.01.2012 в 18:58)
 

проверил, файл загружается, есть ошибки при создании маленького изображения....
у Вас наверное отключён вывод ошибок в браузер...
Но, файл грузится это точно.
Теперь вот какая фигня получается...
1) Имя файла загруженного 0.51877800 1326295395.jpg, в комментарии к скрипту написано, что берётся временная метка, чтобы имя было уникальным.
Согласен, но читать такое имя сложно.
Для формирования нового имени я бы предложил

$new_name = date("YmdHis", time());

так по крайней мере в имени файла будет понятная для человека временная метка, а именно
ГодМесяцДеньЧасМинутаСекунда.jpg
Вот это я бы тоже исключил

<?php 
copy
($_FILES['foto1']['tmp_name'], $uploadfoto1); 
if(
preg_match('/[.](GIF)|(gif)$/',$filename1))  

$im imagecreatefromgif($uploadfoto1) ; //если оригинал был в формате gif, то создаем изображение в этом же формате. Необходимо для последующего сжатия

if(
preg_match('/[.](PNG)|(png)$/',$filename1))  

$im imagecreatefrompng($uploadfoto1) ;//если    оригинал был в формате png, то создаем изображение в этом же формате. Необходимо для последующего сжатия 

if(
preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/',$filename1))  

$im imagecreatefromjpeg($uploadfoto1); //если оригинал был в формате jpg, то создаем изображение в этом же формате. Необходимо для последующего сжатия
}
?>

В документации советуют избегать применение рег. Выражений без особой нужды
этот участок кода можно переписать так

<?php
list($x$y$type) = getimagesize($i_path); // высота, ширина и тип mime исходного изображения 
// получается, что если $type == 1 то это gif изображение, если $type == 2 то jpg и так далее...
// подробно о функции getimagesize() смотрите в руководстве пользователя по php
    
switch($type){
      case 
$image imagecreatefromgif($i_path); break;
      case 
$image imagecreatefromjpeg($i_path); break;
      default : 
$image imagecreatefrompng($i_path);
    }
?>

Получается что всё то, что после copy() надо выполнять после того, как будет подтверждение того, что файл загружен.
в целях безопасности рекомендуют использовать move_uploaded_file()
вот что должно быть

<?php 
/* предыдущий код */
if(move_uploaded_file()){
 
/* тут выполняется код по уменьшению файла и записи имени в базу данных */
}
else{
 
jecho "Ошибка при загрузке файла";
}

  Ответить  
 
 автор: sega_z   (11.01.2012 в 20:19)   письмо автору
 
   для: Slo_Nik   (11.01.2012 в 19:34)
 

Спасибо за советы!

Что за ошибки выдаются при создании маленького изображения?
Или они не влияют на общий результат?

  Ответить  
 
 автор: Slo_Nik   (11.01.2012 в 21:25)   письмо автору
 
   для: sega_z   (11.01.2012 в 20:19)
 

конечно же влияют
если у Вас включен вывод ошибок , то и Вы их должны видеть

  Ответить  
 
 автор: sega_z   (11.01.2012 в 21:28)   письмо автору
 
   для: Slo_Nik   (11.01.2012 в 21:25)
 

Странно... Все другие ошибки я вижу, а эти нет!
Вы можете сказать, где и в какой момент отображаются ошибки?
Что именно вызывает ошибку?

  Ответить  
 
 автор: Slo_Nik   (11.01.2012 в 21:54)   письмо автору
 
   для: sega_z   (11.01.2012 в 21:28)
 

если Вы используете move_uploaded_file(), то ошибка возникает в этой строке
<?php  // Создание маленького изображения №1 
$size1 getimagesize($_FILES['foto1']['tmp_name']);

дальше по коду эта ошибка вызывает другие...

  Ответить  
 
 автор: sega_z   (11.01.2012 в 22:26)   письмо автору
 
   для: Slo_Nik   (11.01.2012 в 21:54)
 

Не могу понять, чем вызвана данная ошибка?!

  Ответить  
 
 автор: Slo_Nik   (11.01.2012 в 22:30)   письмо автору
 
   для: sega_z   (11.01.2012 в 22:26)
 

вызывается тем, что после загрузки файла автоматически удаляется временный файл, а Вы пытаетесь в этой строке к нему обратиться
после загрузки файла надо работать с уже новым именем файла

  Ответить  
 
 автор: sega_z   (11.01.2012 в 22:33)   письмо автору
 
   для: Slo_Nik   (11.01.2012 в 22:30)
 

Ага... понял...

Ещё раз СПАСИБО!!!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования