
Эксперт
  
Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh
Репутация: 41 Всего: 60
|
Добрый день существует проблема ресайз картинки через запуск скрипта .htaccess с последующим сохранением файла на диск и одновременным выводом. Скрипт запускается только тогда когда нет картинки далее скрипт ищит файл исходного изображения на диски если есть файл то смотрит параметр ресайза из адресной строки запроса если параметр удовлетворяет конфиг ресайзов выполняет ресайз При одновременном ресайзе и сохранении файла на диск с таким же название как и запрашиваемый файл .htaccess пытается отдать пустой файл второй запуск по пути картинки файл отдается уже без участия PHP и htaccess нормально. Такое чувство что PHP не успевает сохранить файл а htaccess слишком быстро берет файл но пустой еще не сохраненной картинки. Код htaccess лежит в папке где лежат картинки дабы не мешать htacess который лежит в корне сайта в папке с картинками папок может быть сколько угодно вложенности. | Код | <IfModule mod_rewrite.c> Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !/auto/resize.php$ RewriteRule ^(.*)$ /auto/resize.php [L] </IfModule>
|
Код файла resize.php | Код | <? ini_set('memory_limit', '350M'); /* * TODO Ресайз картинок с сохранением */
// Доступные размеры ресайза для парметра адресса $_img_fan_width_array = array( 60, 80, 138, 168, 180, 322, 384, 600 );
/* ресайз с параметрами для ширины и высоты */ $_img_fan_width_array2 = array( 60 =>44, 80 =>60, 138=>98, 168=>100, 180=>124, 322=>214, 384=>295, 600=>480 );
$url = $_SERVER['REQUEST_URI']; $path = pathinfo($url ); /* регуляркой найдем параметр ширины в названии файла */ $reg = "#^([0-9]){2,3}_#ixs"; preg_match($reg ,$path['filename'] , $math ); /* если есть совпадения идем дальше */ if(count($math)>0){ $widh = str_replace('_','', $math[0]); if(in_array($widh , $_img_fan_width_array)){ // путь оригинала файла. $path1 = $_SERVER['DOCUMENT_ROOT'] . $path['dirname'] . "/" . str_replace( $widh . "_" , '', $path['filename'] ) . ".". $path['extension']; //print $path1; /* путь сохраения файла*/ $pathsave = $_SERVER['DOCUMENT_ROOT'] . $path['dirname'] . "/" . $widh."_" . ltrim( $path['filename'] , $widh."_") . ".". $path['extension'];
if(!img_resize( $path1 , '' //$pathsave // маленький баг пока идет сохранение идет и вывод в результате картинка отдается пустой. , $widh , // ширина $_img_fan_width_array2[$widh], //высото 0xFFFFFF , // бграунт заливки 95 , // качество картинки если используется джипег false // использовать заливку бграунд если фото меньше. )){ print "no foto";} } /* 600_6ee8afb6e6128d60149179a17a75b0d1.jpg */ }
/** * TODO Ресайз изображения * $src - Исходный файл * $dest - куда сохранять * $width - Новая Ширина картинки * $height - Новая Высота картинки * $rgb - Фон заливки * $quality качество картинки если используется джипег * $bgProperty false - использовать фон заливки и передерживаться размера заданной ширины и высоты */ function img_resize($src, $dest, $width, $height, $rgb=0xFFFFFF, $quality=100 , $bgProperty = false){ if (!file_exists($src)) return false; $size = getimagesize($src); if ($size === false) return false; // Определяем исходный формат по MIME-информации, предоставленной // функцией getimagesize, и выбираем соответствующую формату // imagecreatefrom-функцию. $format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1)); $icfunc = "imagecreatefrom" . $format; if (!function_exists($icfunc)) return false; if(($width < $size[0]) or ($height < $size[1])){ $x_ratio = $width / $size[0]; $y_ratio = $height / $size[1]; $ratio = min($x_ratio, $y_ratio); $use_x_ratio = ($x_ratio == $ratio); if($use_x_ratio){ $new_width = $width; }else{ $width = $new_width = floor($size[0] * $ratio); } if(!$use_x_ratio){ $new_height = $height; }else{ $new_height = floor($size[1] * $ratio); $height = $new_height; } }else{ $new_width = $size[0]; $new_height = $size[1]; $width = $size[0]; $height = $size[1]; }
$new_left = $use_x_ratio ? 0 : floor(($width - $new_width) / 2); $new_top = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2); $isrc = $icfunc($src); if($bgProperty==false){ $idest = imagecreatetruecolor($width, $height); imagefill($idest, 0, 0, $rgb); imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1]); }else{ $idest = imagecreatetruecolor($new_width, $new_height); imagefill($idest, 0, 0, $rgb); imagecopyresampled($idest, $isrc, 0, 0, 0, 0, $new_width, $new_height, $size[0], $size[1]); } $icfunc2 = "image" .$format; if($format=='jpeg'){ header("Content-Type: image/jpeg" ); // imagejpeg($idest, '', $quality); imagejpeg($idest, $dest, $quality); }else{ header("Content-Type: image/" . $format ); //$icfunc2( $idest, ''); $icfunc2( $idest, $dest); } imagedestroy($isrc); imagedestroy($idest); return true; }
|
Кто знает как сохранить и отдать файл
--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
|