Перейти к содержимому

Реферальная программа Мегаплана

Партнерская программа Kredov

  • Закрытая тема Тема закрыта

Загрузка картинки с последющим тройным изменением размера

#11 lesli007

lesli007
    Topic Starter
  • Пользователь
  • 108 сообщений
  • Репутация: -4
0

Отправлено 23 Март 2011 - 21:43

Методом, указанным администратором выше. Разобрался в проблеме. Для увеличения размера памяти создал .htaccess и ввел строку php_value memory_limit 64M
  • 0

#12 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 23 Март 2011 - 21:47

lesli007, смотрите... На локалке это одно. Хоть любую доступную память выделяйте. На виртуальных серверах данное значение обычно 32 Мб. Для некоторых делают исключения. Вы на локалке работаете или вам сервер позволил изменить memory_limit?
  • 0

#13 lesli007

lesli007
    Topic Starter
  • Пользователь
  • 108 сообщений
  • Репутация: -4

Отправлено 23 Март 2011 - 21:49

Я уже тестирую на сервере и все нормально стало после изменения значения. А если бы не получилось так, при просьбе к хостеру - он мог бы мне увеличить память?
  • 0

#14 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 23 Март 2011 - 22:25

все от хостера завист


  • 0

#15 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 23 Март 2011 - 22:41

lesli007, все правильно вам говорят. Я так понимаю - вопрос решен? Тему можно закрывать?
  • 0

#16 lesli007

lesli007
    Topic Starter
  • Пользователь
  • 108 сообщений
  • Репутация: -4

Отправлено 23 Март 2011 - 23:19

я прикручиваю к загрузке автоматическое именование файлов. Вытаскиваю последнее id и прибавляю к нему 1. Вот код
 // Высчитываем id и создаем названия
$new_id = $myrow['id']+1;
$pic1="big_img".$new_id.".jpg";
$pic2="small_img".$new_id.".jpg";
$pic3="img".$new_id."_pic.jpg";
$pic4="img".$new_id."_ramka.jpg";
// сжимаем/увеличиваем по ширине картинку до 2056px, ширина - по пропорциям
$files_resized[] = resize($file, 2560, "w", "$pic1", $_POST['file_rotate']);
// сжимаем/увеличиваем по ширине картинку до 613px, ширина - по пропорциям
$files_resized[] = resize($file, 613, "w", "$pic2", $_POST['file_rotate']);
// сжимаем/увеличиваем по ширине картинку до 114px, высота - по пропорциям
$files_resized[] = resize($file, 114, "w", "$pic3", $_POST['file_rotate']);
// сжимаем/увеличиваем по ширине картинку до 500px, высота - по пропорциям
$files_resized[] = resize($file, 105, "w", "$pic4", $_POST['file_rotate']);

// Удаляем временный файл загруженного оригинала
unlink($tmp_path . $file['tmp_name']);
// Загрузка файла и вывод сообщения
$res=0;
if (!@copy('$pic1', 'files/big_img/$pic1'))
$res=$res;
else
$res=$res+1;
if (!@copy('$pic2', 'files/small_img/$pic2'))
$res=$res;
else
$res=$res+1;
if (!@copy('$pic3', 'files/img_pic/$pic3'))
$res=$res;
else
$res=$res+1;
if (!@copy('$pic4', 'files/img_ramka/$pic4'))
$res=$res;
else
$res=$res+1;




if (unlink('$pic1'))
$res=$res+1;
else
$res=$res;
if (unlink('$pic2'))
$res=$res+1;
else
$res=$res;
if (unlink('$pic3'))
$res=$res+1;
else
$res=$res;
if (unlink('$pic4'))
$res=$res+1;
else
$res=$res;

if ($res==8)
{$print = "Загрузка прошла успешно<br>Перейдите по ссылке <a href='#'>Шаг №2</a>"; }
else
{$print = "Произошла ошибка при обработке файла! Обратитесь к администратору!";}

Результат: картинки созданы успешно в папке где находится файл. Но они не скопированы в новые папки и не удалены из основной.
Я сам понимаю что вместо переменной в функции копирования и уничтожения я должен поставить точное название файла. Однако как мне это сделать если изначально я не знаю номер id?
  • 0

#17 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 24 Март 2011 - 00:10

lesli007, не уверен в правильности определения вами уникального id. Он может идти и не по порядку. Когда-нить наткнетесь... Так же, зачем заключать в кавычки текстовую переменную при передаче параметров в функцию?! Ну да ладно, не об этом речь.
Наверное я не зря создал массив $files_resized
Перебирая его, вы можете скопировать ваши файлы, а затем и удалить.
Вот к примеру можно использовать такой код:
// Высчитываем id и создаем названия
$new_id = $myrow['id']+1;
$pic1="big_img".$new_id.".jpg";
$pic2="small_img".$new_id.".jpg";
$pic3="img".$new_id."_pic.jpg";
$pic4="img".$new_id."_ramka.jpg";
// сжимаем/увеличиваем по ширине картинку до 2056px, ширина - по пропорциям
$files_resized['big_img'] = resize($file, 2560, "w", $pic1, $_POST['file_rotate']);
// сжимаем/увеличиваем по ширине картинку до 613px, ширина - по пропорциям
$files_resized['small_img'] = resize($file, 613, "w", $pic2, $_POST['file_rotate']);
// сжимаем/увеличиваем по ширине картинку до 114px, высота - по пропорциям
$files_resized['img_pic'] = resize($file, 114, "w", $pic3, $_POST['file_rotate']);
// сжимаем/увеличиваем по ширине картинку до 500px, высота - по пропорциям
$files_resized['img_ramka'] = resize($file, 105, "w", $pic4, $_POST['file_rotate']);

// Удаляем временный файл загруженного оригинала
unlink($tmp_path . $file['tmp_name']);

foreach($files_resized as $catalog => $name)
{
@copy($name, 'files/{$catalog}/' . basename($name)); // копируем картинки
unlink($name); // удаляем временные картинки
}

Код конечно не идеальный, но мне не охота переделывать по 10 раз функцию :) Должно работать.

P.s.: Вообще хотел сделать что-то универсальное, но подумал, что раз есть определенная задача, то и дам вам решение под неё.
  • 0

#18 lesli007

lesli007
    Topic Starter
  • Пользователь
  • 108 сообщений
  • Репутация: -4

Отправлено 24 Март 2011 - 00:31

Вы делаете огромную полезную работу и еще раз спасибо за это. Извините, что пришлось так много вас тревожить, но теперь файлы даже не создаются :). Я приведу код всей страницы, может я что-то не понимаю или уже упускаю.
<?php 
/**
*
* $file - массив с данными (именем файла, временным именем файла, типом и т.д.)
* $dim_resize - размер, до которого будем изменять изображение (увеличивать или уменьшать)
* $side - на какую из сторон будем смотреть - ширина ("w") или высота "h"
* $save_file - имя файла с расширением, под которым хотим сохранить картинку
* $rotate - поворот картинки
* $quality - качество выходной картинки (для привьюшек можно и поменьше от 1 до 100)
*
*/

function resize($file, $dim_resize, $side = "w", $save_file="", $rotate = null, $quality = null)
{
// Если указано имя для сохранения, то изменяем стандартное
$file['name'] = ( $save_file != "" ) ? $save_file : $file['name'];

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

// 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;

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

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

// определяем коэффициент сжатия/растяжения
$ratio = ( $side == "w" ) ? $w_src / $dim_resize : $h_src / $dim_resize;

$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, $file['path_save'].$file['name'], $quality);
imagedestroy($dest);
imagedestroy($src);

return $file['path_save'].$file['name'];
}
// Пути загрузки файлов
$path = 'i/';
$tmp_path = 'tmp/';

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

// Максимальный размер файла
$size = 4096000;

// Обработка запроса
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>');

$file = $_FILES['picture']; // копируем параметры картинки в переменную $file
$file['save_patch'] = $tmp_path; // добавляем к ним путь для сохранения resize-картинок

$files_resized = array(); // здесь будут храниться путь+имя resize-файлов

// Высчитываем id и создаем названия
$new_id = $myrow['id']+1;
$pic1="big_img".$new_id.".jpg";
$pic2="small_img".$new_id.".jpg";
$pic3="img".$new_id."_pic.jpg";
$pic4="img".$new_id."_ramka.jpg";
// сжимаем/увеличиваем по ширине картинку до 2056px, ширина - по пропорциям
$files_resized['big_img'] = resize($file, 2560, "w", $pic1, $_POST['file_rotate']);
// сжимаем/увеличиваем по ширине картинку до 613px, ширина - по пропорциям
$files_resized['small_img'] = resize($file, 613, "w", $pic2, $_POST['file_rotate']);
// сжимаем/увеличиваем по ширине картинку до 114px, высота - по пропорциям
$files_resized['img_pic'] = resize($file, 114, "w", $pic3, $_POST['file_rotate']);
// сжимаем/увеличиваем по ширине картинку до 500px, высота - по пропорциям
$files_resized['img_ramka'] = resize($file, 105, "w", $pic4, $_POST['file_rotate']);

// Удаляем временный файл загруженного оригинала
unlink($tmp_path . $file['tmp_name']);

foreach($files_resized as $catalog => $name)
{
@copy($name, 'files/{$catalog}/' . basename($name)); // копируем картинки
unlink($name); // удаляем временные картинки
}

}

?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="picture">
<br>
<input type="submit" value="Загрузить">
</form>


Так же приложил ошибки при полном выводе. Волнует именно последняя ошибка про удаление временного файла. Остальные из за того что пока не передаю поворот картинки. А про path save не мешала работе кода

Прикрепленные изображения

  • error.jpg

  • 0

#19 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 24 Март 2011 - 00:39

lesli007,
1) Вы убрали из формы поле поворота картинки, а переменная то осталась в коде. Тогда вам надо заменить все $_POST['file_rotate'] на нули.
2) Вам надо передавать path_save, иначе возниает ошибка в функции resize, т.к. там используется значение данного ключа из массива для указания папки сохранения. Если вы её не укажите - ошибка -> не сохранение файлов.
У вас строка
   $file['save_patch'] = $tmp_path; // добавляем к ним путь для сохранения resize-картинок

А должно быть:
   $file['path_save'] = $tmp_path; // добавляем к ним путь для сохранения resize-картинок

  • 0

#20 lesli007

lesli007
    Topic Starter
  • Пользователь
  • 108 сообщений
  • Репутация: -4

Отправлено 24 Март 2011 - 00:47

Внес изменения, осталась ошибка
Warning: unlink(tmp//tmp/phpH0kuPw) [function.unlink]: No such file or directory in /home/s/stroimvsrf/public_html/admin/new_proekt.php on line 176
И файлы не создаются нигде
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru