Скрипт загрузки картинок на сервер

P
На сайте с 02.06.2006
Offline
123
4663

Всем привет!

Есть такой вот фри скрипт загрузки картинок на сервер, может кто с ним уже знаком.

Он отлично режет картинку по нужной ширине и сохраняет ее в заданную папку.

Есть 2 варианта сохранять картинку, например 110 или 1000 по ширине.

Суть вопроса заключается в том: как настроить скрипт, что бы он сохранял например в 3 разные папки своего размера картинки 100 300 и 600 пикселей в ширину?

Вот сам скрипт:


<body>
<h1>Загрузка изображения с изменением размеров</h1>
<?php

// Пути загрузки файлов
$path = '../../images/110w/';
$tmp_path = 'tmp/';
// Массив допустимых значений типа файла
$types = array('image/gif', 'image/png', 'image/jpeg');
// Максимальный размер файла
$size = 1024000;

// Обработка запроса
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
// Проверяем тип файла
if (!in_array($_FILES['picture']['type'], $types))
die('<p>Запрещённый тип файла. <a href="?">Попробовать другой файл?</a></p>');

// Проверяем размер файла
if ($_FILES['picture']['size'] > $size)
die('<p>Слишком большой размер файла. <a href="?">Попробовать другой файл?</a></p>');

// Функция изменения размера
// Изменяет размер изображения в зависимости от type:
// type = 1 - эскиз
// type = 2 - большое изображение
// rotate - поворот на количество градусов (желательно использовать значение 90, 180, 270)
// quality - качество изображения (по умолчанию 75%)
function resize($file, $type = 1, $rotate = null, $quality = null)
{
global $tmp_path;

// Ограничение по ширине в пикселях
$max_thumb_size = 110;
$max_size = 1000;

// Качество изображения по умолчанию
if ($quality == null)
$quality = 96;

// Cоздаём исходное изображение на основе исходного файла
if ($file['type'] == 'image/jpeg')
$source = imagecreatefromjpeg($file['tmp_name']);
elseif ($file['type'] == 'image/png')
$source = imagecreatefrompng($file['tmp_name']);
elseif ($file['type'] == 'image/gif')
$source = imagecreatefromgif($file['tmp_name']);
else
return false;

// Поворачиваем изображение
if ($rotate != null)
$src = imagerotate($source, $rotate, 0);
else
$src = $source;

// Определяем ширину и высоту изображения
$w_src = imagesx($src);
$h_src = imagesy($src);

// В зависимости от типа (эскиз или большое изображение) устанавливаем ограничение по ширине.
if ($type == 1)
$w = $max_thumb_size;
elseif ($type == 2)
$w = $max_size;

// Если ширина больше заданной
if ($w_src > $w)
{
// Вычисление пропорций
$ratio = $w_src/$w;
$w_dest = round($w_src/$ratio);
$h_dest = round($h_src/$ratio);

// Создаём пустую картинку
$dest = imagecreatetruecolor($w_dest, $h_dest);

// Копируем старое изображение в новое с изменением параметров
imagecopyresampled($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);

// Вывод картинки и очистка памяти
imagejpeg($dest, $tmp_path . $file['name'], $quality);
imagedestroy($dest);
imagedestroy($src);

return $file['name'];
}
else
{
// Вывод картинки и очистка памяти
imagejpeg($src, $tmp_path . $file['name'], $quality);
imagedestroy($src);

return $file['name'];
}
}

$name = resize($_FILES['picture'], $_POST['file_type'], $_POST['file_rotate']);

// Загрузка файла и вывод сообщения
if (!@copy($tmp_path . $name, $path . $name))
echo '<p>Что-то пошло не так.</p>';
else
echo '<p>Загрузка прошла удачно <a href="' . $path . $_FILES['picture']['name'] . '">Посмотреть</a>.</p>';

// Удаляем временный файл
unlink($tmp_path . $name);
}

?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="picture">
<br>
<label>Тип загрузки</label>
<br>
<select name="file_type">
<option value="1">110px по ширине</option>
</select>
<br>
<input type="submit" value="Загрузить">
</form>
<? echo '<p>' . $_FILES['picture']['name'] . '</p>';?>
</body>


PS: символы ***93; и ***91; это квадратные скобки..

P
На сайте с 02.06.2006
Offline
123
#1

plz help :2cents:

S
На сайте с 13.10.2014
Offline
171
#2

Вам код нужен или алгоритм работы?

если код, то только ближе к ночи.

если алгоритм, то могу расписать.

Но в целом код очень хорошо откаменчен, поэтому он очень прост для доработок

IW
На сайте с 16.12.2014
Offline
73
#3

для начала код в теги CODE сделайте а не в PHP, или на пастебин выложите, а то еще ***93;***91; править?

SSD VPS скидка 25% по купону iwork https://cp.inferno.name/cart.php?gid=23 | надежный хостинг http://bit.ly/2Yiq93h
P
На сайте с 02.06.2006
Offline
123
#4

Спасибо silicoid, по сути он написал универсальный скрипт, где можно ресайзить кучу вариантов изображения и сохранять их по разным папкам, с множеством настроек.

Если вдруг кому то понадобится вот код скрипта:


<html>
<head>
<title>Загрузка изображения с изменением размеров</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<h1>Загрузка изображения с изменением размеров</h1>
<?php

// Пути загрузки файла
$tmp_path = 'tmp/';

// Основные настройки
//
$config = array(
'tmp_path' => $tmp_path,
'paths' => array('i/', 'j/', 'k/'), // путь до большой картинки
'thumbs_paths' => array('i/thumb/', 'j/thumb/', 'k/thumb/'), // путь до превьюшки
'max_sizes' => array(600,700,800), // Размеры больших картинок
'max_thumb_sizes' => array(200,300,400), // Размеры превьюшек
'qualities' => array(95,95,95), // качество сохранения
'rotate_statuses' => array(0,0,0), // поворот для каждой картинки
);

// Массив допустимых значений типа файла
$types = array('image/gif', 'image/png', 'image/jpeg');
// Максимальный размер файла
$size = 1024000;

// Обработка запроса
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
// Проверяем тип файла
if (!in_array($_FILES['picture']['type'], $types))
die('<p>Запрещённый тип файла. <a href="?">Попробовать другой файл?</a></p>');

// Проверяем размер файла
if ($_FILES['picture']['size'] > $size)
die('<p>Слишком большой размер файла. <a href="?">Попробовать другой файл?</a></p>');



// Функция изменения размера
// Изменяет размер изображения в зависимости от type:
// type = 1 - эскиз
// type = 2 - большое изображение
// rotate - поворот на количество градусов (желательно использовать значение 90, 180, 270)
// quality - качество изображения (по умолчанию 75%)
function resize($file, $max_thumb_size=200, $max_size=600, $type = 1, $rotate = null, $quality = 75 )
{

global $config;
$tmp_path = $config['tmp_path'];

// Cоздаём исходное изображение на основе исходного файла
if ($file['type'] == 'image/jpeg')
$source = imagecreatefromjpeg($file['tmp_name']);
elseif ($file['type'] == 'image/png')
$source = imagecreatefrompng($file['tmp_name']);
elseif ($file['type'] == 'image/gif')
$source = imagecreatefromgif($file['tmp_name']);
else
return false;

// Поворачиваем изображение
if ( ($rotate != null) or ($rotate > 0))
$src = imagerotate($source, $rotate, 0);
else
$src = $source;

// Определяем ширину и высоту изображения
$w_src = imagesx($src);
$h_src = imagesy($src);

// В зависимости от типа (эскиз или большое изображение) устанавливаем ограничение по ширине.
if ($type == 1)
$w = $max_thumb_size;
elseif ($type == 2)
$w = $max_size;

// Если ширина больше заданной
if ($w_src > $w)
{
// Вычисление пропорций
$ratio = $w_src/$w;
$w_dest = round($w_src/$ratio);
$h_dest = round($h_src/$ratio);

// Создаём пустую картинку
$dest = imagecreatetruecolor($w_dest, $h_dest);

// Копируем старое изображение в новое с изменением параметров
imagecopyresampled($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);

// Вывод картинки и очистка памяти
imagejpeg($dest, $tmp_path . $file['name'], $quality);
imagedestroy($dest);
imagedestroy($src);

return $file['name'];
}
else
{
// Вывод картинки и очистка памяти
imagejpeg($src, $tmp_path . $file['name'], $quality);
imagedestroy($src);

return $file['name'];
}
}


// кол-во вариантов масштабирования
$variants = sizeof($config['paths']);

// прогоняем все варианты
for ($itr = 0; $itr < $variants; $itr ++){

// меняем папку в зависимости от выбраного типа масштабирования
if ($_POST['file_type'] == 1 ){
$outPath = $config['thumbs_paths'][$itr];
} else {
$outPath = $config['paths'][$itr];
}

$name = resize($_FILES['picture'],$config['max_thumb_sizes'][$itr], $config['max_sizes'][$itr], $_POST['file_type'], $config['rotate_statuses'][$itr], $config['qualities'][$itr]);

// Загрузка файла и вывод сообщения
if (!@copy($tmp_path.$name, $outPath.$name))
echo '<p>Что-то пошло не так в шаге '.$itr.'.</p>';
else
echo '<p>Загрузка '.$itr.' прошла удачно <a href="'.$outPath.$_FILES['picture']['name'].'">Посмотреть</a>.</p>';

// Удаляем временный файл на последнем шаге
if ($itr == $variants-1){
unlink($tmp_path.$name);
}
}

// вообще функция ресайз стала гораздо более универсальной.
// если не нужно генерить кучу картинок,то можно пользоваться только ей одной
// надо закоментировать цикл
// а вместо него раскоментить строки ниже

// $name = resize($_FILES['picture'], размер_превьюхи , размер_большой_картинки, Тип_масштабирования:_1-если_нужна_превьюха_2-если_нужна_большая, на_сколько_градусов_повернуть_[0--359], с_каким_качеством_сохранить_[1--100]);
// $outPath = 'путь_куда_сохранять_картинку';
// if (!@copy($tmp_path.$name, $outPath.$name))
// echo '<p>Что-то пошло не так .</p>';
// else
// echo '<p>Загрузка прошла удачно <a href="'.$outPath.$_FILES['picture']['name'].'">Посмотреть</a>.</p>';

// ...
// повторить предыдущие строки N раз -- сколько нужно превьюшек
// ...

//удаление темп файла
// unlink($tmp_path.$name);
}

?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="picture">
<br>
<label>Тип загрузки</label>
<br>
<select name="file_type">
<option value="1">Эскиз</option>
<option value="2">Большое изображение</option>
</select>
<br>
<label>Поворот</label>
<br>
<input type="text" name="file_rotate">
<br>
<input type="submit" value="Загрузить">
</form>
</body>
</html>

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий