4

ユーザー入力からファイルをアップロードし、サムネイルのサイズを変更して、2 つの新しいファイル名をデータベースに追加するスクリプトを作成しています。

しかし、私は一生、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.'; }

ここで私が理解できない部分があります: .jpeg をアップロードするときはコードは正常に機能しますが、PNG または GIF の場合、「画像 '127.0.0.1:8888」というページが表示されます。 「エラーが含まれているため表示できません。」正しいヘッダー MIME タイプを持っていてはいけないと思いますが、それは何か他のものでしょうか?

.jpeg を選択すると、イメージ フォルダに問題なくアップロードされ、必要に応じて Thumbnail フォルダにサムネイルが生成されます。

しかし、PNG と GIF で試してみるとすぐに失敗します。明らかな何かが欠けているに違いありませんか?

このコードは、私が達成しようとしていることに適していますか?

前もって感謝します、

4

2 に答える 2

6

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);

はい、上記のすべてのコードは4レーンに削減されました。


いくつかの指針:

  • に依存しないでください$_FILES[]['mime']。これはユーザーエージェントによって送信されたものであり、信頼することはできません。
  • 同じ理由で、ファイル名はに基づいていません$_FILES[]['name']

また、元のコードは機能しないため、機能しませんmove_uploaded_file()

于 2011-03-10T01:18:28.717 に答える
0

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');
于 2011-03-10T08:11:22.763 に答える