|
|
|
| Это снова я!
В интернете нашел код по обработке и загрузке изображений на сервер + немного подработал сам:
<?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, т.к. самой картинки нет в папке.
Как сделать в этом коде, чтобы путь до фото заносился только в случае успешной загрузки фото? | |
|
|
|
|
|
|
|
для: 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)){
// запрос к базе на запись имени файла
}
?>
|
| |
|
|
|
|
|
|
|
для: Slo_Nik
(11.01.2012 в 01:56)
| | Благодарю за помощь!!! | |
|
|
|
|
|
|
|
для: sega_z
(11.01.2012 в 16:30)
| | не за что благодарить, это только маленькая толика того, что можно поменять в Вашем коде.
например: проверка объёма изображения тоже поменять не мешало бы. | |
|
|
|
|
|
|
|
для: Slo_Nik
(11.01.2012 в 16:41)
| | А что там не так? | |
|
|
|
|
|
|
|
для: 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, но выдаст ошибку | |
|
|
|
|
|
|
|
для: Slo_Nik
(11.01.2012 в 17:29)
| | Да, действительно!
Спасибо!
Только почему то не срабатывает if(move_uploaded_file($_FILES['foto1']['tmp_name'], $uploadfoto1))
Эта работает: if(copy($_FILES['foto1']['tmp_name'], $uploadfoto1)) | |
|
|
|
|
|
|
|
для: sega_z
(11.01.2012 в 17:52)
| | в чём выражается "не срабатывает"?
начните с error_reporting(E_ALL); пропишите самой первой строчкой в коде.
возможно ошибка в пути к директории для загрузки файлов
или недостаточно прав доступа к директории
<?php
if(move_uploaded_file($_FILES['foto1']['tmp_name'], $uploadfoto1)){
// запрос к базе на запись имени файла
}
else{
echo "Файл не загружен";
}
|
| |
|
|
|
|
|
|
|
для: Slo_Nik
(11.01.2012 в 18:33)
| | Путь к файлу заносится в БД, а изображения нет (выдает содержимое тега ALT)
И сообщение об ошибке не выдает. | |
|
|
|
|
|
|
|
для: sega_z
(11.01.2012 в 18:38)
| | проверяйте путь к директории | |
|
|
|
|
|
|
|
для: Slo_Nik
(11.01.2012 в 18:46)
| | Причем тут путь к директории я ничего не меняю, кроме функции "copy" на "move_uploaded_file".
C функцией copy все нормально, а с другой функцией ... | |
|
|
|
|
|
|
|
для: 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 в случае возникновения ошибки.
|
| |
|
|
|
|
|
|
|
для: SerG7
(11.01.2012 в 19:14)
| | Т.е. move_uploaded_file() - это вырезать и вставить, а copy() - копировать и вставить?
Имена загружаемых файлов неизвестны, т.к. их загружают пользователи со своих компьютеров и они могут быть разнообразные.
Не понял вопрос: "Какой протокол или это просто копирование...." | |
|
|
|
|
|
|
|
для: sega_z
(11.01.2012 в 19:27)
| | move_uploaded_file() работает ТОЛЬКО с файлами загруженными по протоколу HTTP POST | |
|
|
|
|
|
|
|
для: SerG7
(11.01.2012 в 19:40)
| | добавлю к вышесказанному.
проверьте атрибут тека form
должно быть так
<form method="post" enctype="multipart/form-data"> | |
|
|
|
|
|
|
|
для: 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 1 : $image = imagecreatefromgif($i_path); break;
case 2 : $image = imagecreatefromjpeg($i_path); break;
default : $image = imagecreatefrompng($i_path);
}
?>
|
Получается что всё то, что после copy() надо выполнять после того, как будет подтверждение того, что файл загружен.
в целях безопасности рекомендуют использовать move_uploaded_file()
вот что должно быть
<?php
/* предыдущий код */
if(move_uploaded_file()){
/* тут выполняется код по уменьшению файла и записи имени в базу данных */
}
else{
jecho "Ошибка при загрузке файла";
}
|
| |
|
|
|
|
|
|
|
для: Slo_Nik
(11.01.2012 в 19:34)
| | Спасибо за советы!
Что за ошибки выдаются при создании маленького изображения?
Или они не влияют на общий результат? | |
|
|
|
|
|
|
|
для: sega_z
(11.01.2012 в 20:19)
| | конечно же влияют
если у Вас включен вывод ошибок , то и Вы их должны видеть | |
|
|
|
|
|
|
|
для: Slo_Nik
(11.01.2012 в 21:25)
| | Странно... Все другие ошибки я вижу, а эти нет!
Вы можете сказать, где и в какой момент отображаются ошибки?
Что именно вызывает ошибку? | |
|
|
|
|
|
|
|
для: sega_z
(11.01.2012 в 21:28)
| | если Вы используете move_uploaded_file(), то ошибка возникает в этой строке
<?php // Создание маленького изображения №1
$size1 = getimagesize($_FILES['foto1']['tmp_name']);
|
дальше по коду эта ошибка вызывает другие... | |
|
|
|
|
|
|
|
для: Slo_Nik
(11.01.2012 в 21:54)
| | Не могу понять, чем вызвана данная ошибка?! | |
|
|
|
|
|
|
|
для: sega_z
(11.01.2012 в 22:26)
| | вызывается тем, что после загрузки файла автоматически удаляется временный файл, а Вы пытаетесь в этой строке к нему обратиться
после загрузки файла надо работать с уже новым именем файла | |
|
|
|
|
|
|
|
для: Slo_Nik
(11.01.2012 в 22:30)
| | Ага... понял...
Ещё раз СПАСИБО!!! | |
|
|
|