1

PHPを使用して画像をサムネイルに処理しています.jpg、.jpeg、および.pngの3つの異なる拡張子タイプを許可しています...最初の2つと後者は、異なる関数で処理する必要があります。 createimagefromjpg() と createimagefrompng() をそれぞれ作成します。

画像のファイル拡張子を取得し、if ステートメントを使用してファイルの種類を確認し、正しく処理できるようにしています。

$extension = pathinfo($filename, PATHINFO_EXTENSION);

// Read source image
if ($extension == ('jpg' || 'jpeg')) {
    $source_image = imagecreatefromjpeg($filename); 
    return '1';
} else if ($extension == 'png') {
    $source_image = imagecreatefrompng($filename);
    return '2';
} else {
    return 'error';
}

この関数は 1 を返すため、jpg および jpeg 画像は正しく処理されます。ただし、png ファイルを通過すると、png != jpeg または jpg であっても、同様に最初のブランチに入り、「1」が返されます。変。このエラーにより、サムネイルがまったく生成されません。

さらに混乱します。==IFステートメントで置き換えて厳密な比較を有効にすると===、jpgファイルとjpegファイルが完全にエラーになり、明らかに「jpg」!=「jpg」(そうであっても)、およびjpegでも同様です。PNG ファイルはスクリプトを完全に壊します。


編集: 問題は私の IF ステートメントではなく、imagecreatefrompng()関数のようです。小さな画像(200x200)では機能しますが、大きな画像では機能しません...誰でもこれを説明できますか?

4

3 に答える 3

5

if ステートメントに間違った構文を使用しています。これを使って:

if ($extension == 'jpg' || $extension == 'jpeg') {

あなたの例は ('jpg' || 'jpeg') をブール値として評価しています。文字列は PHP で true と評価されるため、そのステートメントは常に正しいです。

$extension次に、ブール値に型キャストして、ステートメントを と同等にし(true == true)ます。

=== 演算子を使用する$extensionと型キャストされないため、("some string value" === true)どちらが false になります。

于 2013-02-25T02:17:58.610 に答える
2

それはあなたがあなたの状態を書く方法ではありません。あなたは現在持っています...

$extension == ('jpg' || 'jpeg')

これは基本的に同じです...

$extension == TRUE

...文字列が空でない限り、これは真です。

代わりに、次のように個別に比較を行います...

$extension == 'jpg' || $extension == 'jpeg'

または、次のことができます...

preg_match("/^jpe?g\z/", $extension);

...また...

in_array($extension, array("jpg", "jpeg"))

などですが、(ほぼ間違いなく) 読みにくいです。

于 2013-02-25T02:19:05.883 に答える
1

mime-type (またはmime_content_type またはFileinfoを使用してファイルの png を取得しようとすることができます。このオプションの方が正確だと思います。

于 2013-02-25T02:20:41.750 に答える