Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Extensions > Глобальный вопрос по библиотеке GD


Автор: mark2009 13.3.2012, 16:03
Здравствуйте всем! Описываю всё по порядку, готовьтесь, будет много кода.

Итак есть очень простой кусок кода:

Код

if (is_uploaded_file($_FILES['filename']['tmp_name']))
  {
      move_uploaded_file($_FILES['filename']['tmp_name'], FULL_UPLOAD_PATH . '/' . $cat_name . '/' . $_FILES['filename']['name']);
      resize_image(FULL_UPLOAD_PATH . '/' . $cat_name . '/' . $_FILES['filename']['name'],  $cat_name, 'resized');
      resize_image_by_width(FULL_UPLOAD_PATH . '/' . $cat_name . '/' . $_FILES['filename']['name'], $category . '_mini500', 500);
      resize_image_by_width(FULL_UPLOAD_PATH . '/' . $cat_name . '/' . $_FILES['filename']['name'], $category . '_mini100_1', 150);
      resize_image_by_width(FULL_UPLOAD_PATH . '/' . $cat_name . '/' . $_FILES['filename']['name'], $category . '_mini100_2', 150);
      resize_image_by_width(FULL_UPLOAD_PATH . '/' . $cat_name . '/' . $_FILES['filename']['name'], $category . '_mini100_3', 150);
      $_SESSION['filename']  =  $_FILES['filename']['name'];
      
    
      $query= 'INSERT INTO items (item_cat_id, item_photo, item_name) VALUES ("'.$category.'", "resized_'.$_FILES['filename']['name'].'", "'.$db->escape($object_name).'")';
      $db->query($query); 
      $message['result'] = true;
      echo 'Всё загружено';
      die();
  }


Что он делает? Проверяет, если файл загружен нормально то перемещает его по указанному месту, а к готовому файлу применяются некоторые функции.
Вот пример функции:

Код


function resize_image_by_width($source_file, $prefix, $dstwidth)
{
    if (!is_image($source_file))
    {
    return false;
    }

    global $path;
    $source_image_info = getimagesize($source_file);

    $source_width    =    $source_image_info[0];
    $source_height    =    $source_image_info[1];

    $ext = get_file_extension($source_file);
    switch ($ext)
    {
    case 'jpg':
    case 'jpeg':
      $create_function = 'imagecreatefromjpeg';
      $save_function   = 'imagejpeg';
      $extension = 'jpg';
    break;
    
    case 'gif':
      $create_function = 'imagecreatefromgif';
      $save_function   = 'imagegif';
      $extension = 'gif';
    break;

    case 'png':
      $create_function = 'imagecreatefrompng';
      $save_function   = 'imagepng';
      $extension = 'png';
    break;

    default:
      $create_function = '';
      $save_function   = '';
      $extension = '';
    break;
    }

    
    if ($dstwidth < 10)
    {
    return false;
    }

    $ratio = $dstwidth / $source_width;
    $dstheight = $source_height * $ratio;

    $source_image = $create_function($source_file);

    $dest_image = imagecreatetruecolor($dstwidth, $dstheight);
    imagecopyresampled($dest_image, $source_image, 0, 0, 0, 0, $dstwidth, $dstheight, $source_width, $source_height);
    $save_function($dest_image, $path . $prefix . '_' . get_pure_file_name($source_file)  . '.' . $extension);
    imagedestroy($dest_image);
}



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

Код


Warning:  imagejpeg() [<a href="function.imagejpeg">function.imagejpeg</a>]: Unable to open '6_mini500_shop.jpg' for writing: Permission denied in <b>XXX</b> on line 174


Думаю, что суть ошибки понятна. Функция просто не может сохранить файл из-за ошибки прав доступа. Да, вместо XXX (я нарочно убрал полный путь к файлу из соображений безопасности) прописано полное имя того php-файла, где эта функция определена.
[/code]

Папка и подпапка, в которую я пытаюсь загрузить рисунки, имеют полные права 0777. Владелец этих папок - пользователь, под которым я захожу на ftp сервер. 

Вопрос: почему недостаточно прав доступа для работы функций? Что предпринять в данном случае?

Автор: Fortop 13.3.2012, 16:31
Цитата(mark2009 @  13.3.2012,  16:03 Найти цитируемый пост)
Да, вместо XXX (я нарочно убрал полный путь к файлу из соображений 

Цитата(mark2009 @  13.3.2012,  16:03 Найти цитируемый пост)
Папка и подпапка, в которую я пытаюсь загрузить рисунки, имеют полные права 0777

А ХХХ совпадает с папкой и подпапкой? smile

ну и плюс проверьте на существование такого файла по этому пути и его права.

Автор: mark2009 14.3.2012, 06:07
Fortop
Вы не поняли...

В приведённом примере файла 6_mini500_shop.jpg естественно нет. Он должен создаваться. Но он НЕ создаётся и пишет ошибку прав. ПОЧЕМУ? Когда и там и там 0777. Почему?

Автор: Fortop 15.3.2012, 08:03
Цитата(mark2009 @  14.3.2012,  06:07 Найти цитируемый пост)
В приведённом примере файла 6_mini500_shop.jpg естественно нет

Для меня это не очевидно и не естествено.
У вас уже может быть файл с таким именем и другими правами. Отсюда и сообщение об ошибке.

Цитата(mark2009 @  14.3.2012,  06:07 Найти цитируемый пост)
Почему? 

Покажите ls -la для папки куда вы пытаетесь записать.

Добавлено через 7 минут и 16 секунд
И это php в каком режиме работает то?
safe mode не включен?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)