2010-01-18 3 views
1

У меня есть небольшой собственный модуль Друпала сельхозкультуры изображения профиля пользователя:PHP ошибка изображения растениеводство

$folder = 'sites/default/files/profile_pictures/'.$uid.'/'; 

$filename = $_POST['filename']; 
$orig_w = 480; 
$orig_h = $_POST['height']; 

$targ_w = 150; 
$targ_h = 92; 

$ratio = $targ_w/$targ_h; 

if(isset($_POST['form_sent'])) 
{ 

    $src = imagecreatefromjpeg($folder.$filename); 

    $tmp = imagecreatetruecolor($targ_w, $targ_h); 
    imagecopyresampled($tmp, $src, 0,0,$_POST['x'],$_POST['y'],$targ_w,$targ_h,$_POST['w'],$_POST['h']); 
    imagejpeg($tmp, $folder.'t_'.$filename,100); 

    $full_path = $folder.'t_'.$filename; 

    imagedestroy($tmp); 
    imagedestroy($src); 

    // database stuff 

} else { 
    return 'Nothing to crop!'; 
} 

95% времени это работает как сон, однако иногда он будет возвращать черное изображение.

Вот пример задачи: http://5oup.net/sites/default/files/profile_pictures/405/t_Photo_8.jpg

и исходный файл: http://5oup.net/sites/default/files/profile_pictures/405/Photo_8.jpg

Любая идея, что может быть неправильно? Мое предположение - это что-то вокруг линии imagecreatetruecolor()?

Заранее спасибо

Джеймс

EDIT

Я не могу воспроизвести ошибку с пользовательским изображением оригинальной, так что я теперь действительно не зная, что привело его в этом дело! Существует функция загрузки изображений до урожая, который я теперь понимаю, может также быть источником ошибки, поэтому в интересах полного раскрытия информации:

if(isset($_POST['form_sent'])) 
{ 
    $imageFile = $_FILES['image']['tmp_name']; 
    $filename = basename($_FILES['image']['name']); 
    $filename = preg_replace("/[^A-Za-z0-9 .]/", '', $filename); 
    $filename = str_replace(" ", '_', $filename); 

    $filename = urlencode($filename); 

    $img_info = getimagesize($imageFile); 

    if (filesize($imageFile) > 510000) { 
     drupal_set_message('Image too large. Please upload a file 500kb or less.', 'error'); 
     $image_form = '<a href="/avatar">Choose a different image</a>'; 
     $output = array(
      'image_form' => $image_form 
     ); 
     return serialize($output); 
    } 

    list($width, $height) = getimagesize($imageFile); 

    switch ($img_info['mime']) { 
     case 'image/png': 
     $src = imagecreatefrompng($imageFile); 
     break; 

     case 'image/jpeg': 
     case 'image/jpg': 
     $src = imagecreatefromjpeg($imageFile); 
     break; 

     case 'image/gif': 
     $src = imagecreatefromgif($imageFile); 
     break; 

     default: 
     drupal_set_message('File type not allowed. Please upload a jpg, gif or png.', 'error'); 
      $image_form = '<a href="/avatar">Jpg, gif or pngs only</a>'; 
      $output = array(
       'image_form' => $image_form 
      ); 
      return serialize($output); 
     break; 
    } 

    $orig_h = ($height/$width)* $orig_w; 

    $tmp = imagecreatetruecolor($orig_w, $orig_h); 
    imagecopyresampled($tmp, $src, 0,0,0,0,$orig_w,$orig_h,$width,$height); 
    imagejpeg($tmp, $folder.$filename, 100); 

    imagedestroy($tmp); 
    imagedestroy($src);  


} 
+0

Что произойдет, если вы добавите этот 'ini_set ('gd.jpeg_ignore_warning', 1);' перед кодом? –

+0

Я дал это, интересно, я не могу воспроизвести ошибку с предоставленным изображением (см. Отредактированный вопрос). –

+0

Как насчет модуля imagecache? Нет необходимости изобретать колесо. – tpow

ответ

0

Файл не существует. Ваша первая функция переименовывает файлы, если есть пробелы, а затем передает ее функции масштабирования.

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

Избавьтесь от кода, сбрасывающего имя файла на пост (вторая строка в исходной функции), и все должно быть в порядке. Кроме того, я сделал бы проверку is_file перед созданием эскиза.

+0

Спасибо за ваш ответ! Эти функции вызываются с разных страниц, поэтому имя файла из первого передается второму как значение скрытой формы, а затем снова возвращается с использованием $ _POST ['filename']. Также, как я говорю, это работает, как и в большинстве случаев, просто случайная ошибка. –

+0

Но время, когда он не работает с типичными файлами с пробелами в них? Я бы попробовал is_file и возвратил ошибку, чтобы убедиться, что это проблема, если вы можете реплицировать, что вы говорите, что можете. – Cryophallion

+0

Unfortunatley Я не могу воспроизвести проблему (см. Мой отредактированный вопрос), но у меня есть пример файла до и после, который обнаруживает проблему. Существует хороший шанс, что в файле ошибок есть пробел, поэтому я дам ваше предложение is_file() и отправлю отчет. –

Смежные вопросы