2014-12-24 8 views
0

Я пытался извлечь файл из формы HTML, а затем создать новый и использовать «imagecopyresampled», чтобы получить из него центральный квадрат, подходящий либо на X, либо Y, в зависимости от того, что меньше.PHP GD изменить размер/обрезать изображение перед загрузкой

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

if($_FILES){ 
    $valid = validate_image("avatar"); 

    if ($valid){ 
     list($width, $height, $type) = getimagesize($_FILES['avatar']['tmp_name']); 

     $scale = $width/$height; 
     $pixels = 150; 
     $tmp_name = $_FILES['avatar']['tmp_name']; 

     switch ($type) { 
      case IMAGETYPE_GIF: 
       $source = imagecreatefromgif($tmp_name); 
       break; 

      case IMAGETYPE_JPEG: 
      case IMAGETYPE_JPG: 
       $source = imagecreatefromjpeg($tmp_name); 
       break; 

      case IMAGETYPE_PNG: 
       $source = imagecreatefrompng($tmp_name); 
       break; 
     } 

     $upload = imagecreatetruecolor($pixels, $pixels); 

     //sketchy image math: Get whichever coordinate is smaller and that will be 150 on the thumbnail from top to bottom (or left to right). 
     //Then for the other one you know the size will be 150, but only for the part starting at (Coordinate/2)-SMALLERCOORD/2 to (coord/2)+SMALLERCOORD/2 

     if ($width>$height){ 
      imagecopyresampled ($upload, $source, 0, 0, 0, ($width-$height/2), 150, 150, $height, $height); 
     } else if ($width<=$height){ 
      imagecopyresampled ($upload, $source, 0, 0, 0, ($height-$width/2), 150, 150, $width, $width); 
     } 

     $name = "./users/$id/avatar.png"; 

     imagepng($upload, $tmp_name); 

     if (!(move_uploaded_file($tmp_name, $name))) $fail .= "<h3>ERROR UPLOADING AVATAR. TRY AGAIN LATER OR CONTACT US.</h3><br>"; 
    } 
} 

Прежде всего позвольте мне увидеть, если я понимаю, как код работает правильно: я получаю файл, проверьте, если она действует с моей функции. Затем я получаю размер и тип его. Я проверяю тип и создаю образ из памяти серверов из него, а другой - пустой размер, который я хочу. Затем я фактически копирую измененное и обрезанное изображение на загружаемом изображении, которое я создал. Там, если бы я хотел, я мог удалить временное «исходное» изображение с imagedestroy, не так ли? Далее я пытаюсь сделать png-файл из «загружаемого» изображения из памяти сервера. Вот где я думаю, что я ошибся, я не могу перезаписать временный файл, не так ли? И затем я пытаюсь поместить изображение временного изображения, где оно должно быть загружено, но это не работает.

Имею ли я это право? Как я могу исправить этот код? Благодарим за внимание.

ответ

0

Итак, после многократного онлайн-поиска я обнаружил, что самая большая проблема была у Пользователя, который выполнял apache (www-data).

Итак, я ввел/etc/apache2/envvars и изменил APACHE_RUN_USER владельцу папки. Затем мне пришлось сделать chown на/etc/lib/php5, чтобы сеансы запирались/работали с новым пользователем.

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

$dir = "./users/$id/"; 
$oldumask = mask(0); 
mkdir ("$dir"); 
chmod("$dir", 0750); 
umask($oldumask); 

Это было добавлено прямо перед созданием PNG изображения. Затем я снял «move_uploaded_file» код и просто использовал функцию imagepng, как предложил Джейкоб Будин:

if(!imagepng($upload, $name)) $fail .= "<h3>ERROR!<h3><br>"; 

Это решило все (но тот факт, что код кадрирования был неправ, но это не имеет значения). Я все еще не уверен на 100%, как GD/PHP отлично обрабатывает изображение, но это работает. Благодарю вас и Мерри Кристамас.

0

Логика, относящаяся к генерации миниатюр, неверна, но ваша более насущная проблема заключается в сохранении файла изображения. Вы пытаетесь сохранить в корне файловой системы (/users/$id/avatar.png), скорее всего, без необходимых разрешений.

Пока вы можете сохранить обратно на путь загрузки, это необязательно. В imagepng просто сохраните файл до места назначения (например, /var/web/app/public/uploads/$id/avatar.png). Вы также можете использовать магическую константу __DIR__, чтобы указать путь относительно файла PHP, выполняющего выполнение.

Что касается обрезки, учитывая использование предварительно созданной функции или библиотеки для создания миниатюр. Я мог бы скопировать код здесь, но другие люди неоднократно били эту проблему до смерти (и исправляли другие потенциальные проблемы, такие как прозрачность). Вы можете просмотреть документацию (и комментарии пользователей) по адресу imagecopyresampled или использовать сложную библиотеку, такую ​​как Imagine.

+0

Моя ошибка. это не было «/users/$id/avatar.png». Я удалил слишком много при редактировании кода, это должен был быть путь относительно файла PHP. "./users/$id/avatar.png". Таким образом, папка пользователей в том же каталоге является кодом PHP. –

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