Использование библиотеки PHP GD для изменения размера и сохранения изображений - АД - PullRequest
4 голосов
/ 10 марта 2011

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

Однако я не могу на всю жизнь понять,как заставить PHP определить тип изображения MIME и затем передать его заголовку.Вот код, я поместил комментарии, чтобы попытаться сделать его как можно более понятным:

        $picture = $_FILES['picture']['name'];

        /*original file location*/                  
        $file = 'picture/'.$picture.'';
        /*save thumbnail location*/
        $save = 'thumb/tn-'.$picture.'';
        /*append thumbnail filename with tn-*/
        $thumb = 'tn-'.$picture.'';
        /*get original file size*/
        list($width, $height) = getimagesize($file);
        /*get image MIME type*/
        $size = getimagesize($file);
        $fp = fopen($file, "r");
        if ($size && $fp) 
        {
        header("Content-type:".$size['mime']);
        fpassthru($fp);
        exit;
        } 
        else 
        {
        echo 'Error getting filetype.';
        }
        /*define thumbnail dimensions*/
        $modwidth = 300;
        $modheight = 200;
        /*check to see if original file is not too small*/
        if (($width > 301) || ($height > 201)) 
        {
        /*create shell for the thumbnail*/
        $tn = imagecreatetruecolor($modwidth, $modheight);

        /*HERE IS WHERE I HAVE TROUBLE*/

        /*if MIME type is PNG*/
        if ($size['mime'] == "image/png")
            {
        /*try to create PNG thumbnail*/
        $image = imagecreatefrompng($file);
        imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height);
        imagepng($tn, $save, 100); 
            }

        /*if MIME type is JPEG*/

        if ($size['mime'] == "image/jpeg")
            {
        $image = imagecreatefromjpeg($file);
        imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height);
        imagejpeg($tn, $save, 100); 
            }

        /*if MIME type is GIF*/

        if ($size['mime'] == "image/gif")
            {
        $image = imagecreatefromgif($file);
        imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height);
        imagegif($tn, $save, 100); 
            }
        }
        else { echo 'Your file is too small.'; }

Итак, вот часть, которую я не понимаю: код отлично работает, когда я загружаю a.jpeg, но если это PNG или GIF, появляется страница с надписью: «Изображение« 127.0.0.1:8888 »не может быть отображено, поскольку оно содержит ошибки».Я полагаю, что он не должен иметь правильный тип MIME заголовка, но может ли это быть что-то еще?

Когда я выбираю .jpeg, он прекрасно загружается в папку с изображениями и генерирует миниатюру в папку с миниатюрами, как я хочу.

Но как только я попробую это с PNG и GIF, это не получится.Должно быть, я упускаю что-то очевидное?

Этот код полезен для того, чего я пытаюсь достичь?

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

Ответы [ 2 ]

6 голосов
/ 10 марта 2011

Использование PHP расширения GD действительно может быть проблемой.Лично я бы рекомендовал использовать библиотеку абстракций, такую ​​как WideImage .Это значительно упростит ваш код:

$picture = $_FILES['picture']['name'];

/*original file location*/                  
$file = 'picture/'.$picture;
move_uploaded_file($_FILES["userfile"]["tmp_name"], $picture);

/*save thumbnail location*/
$save = 'thumb/tn-'.$picture;

// Magic Begins Here ......

require "path-to/WideImage.php";

$image = WideImage::load($picture);
$thumb = $image->resizeDown(300, 200, 'inside');

$thumb->saveToFile($save);

Да, весь этот код уменьшен до четырех полос.


Несколько указателей:

  • Никогдаположитесь на $_FILES[]['mime'].Он отправлен агентом пользователя и ему нельзя доверять.
  • По той же причине я не буду основывать свои имена файлов на $_FILES[]['name'].

Кроме того, на вашем оригиналекод не работает, потому что вы никогда не move_uploaded_file().

0 голосов
/ 10 марта 2011

Получил лучшее решение, изображения хедлинга могут быть забавными, если использовать класс Thumbnailer .

function callb(& $image) {
   $image->thumbFixed(300,200)->save('/some/location/'.$image->filename);
}

// myFile refers to $_FILES['myFile']
// upload image and handle it
Thumbnailer::upload('myFile', 'callb');
...