PHPでは、 image_type_to_extension(int $ himas_type、bool $ contruct_dot = true):string | falseは、拡張子( .pngなど)に変換するために( imageType_pngなど)によく使用されます。
しかし、実際のプロジェクトでは、多くの学生が「間違った延長を返した」とフィードバックします。ほとんどの場合、関数が間違っているわけではなく、コールメソッドまたは事前判断に問題があるということです。
以下は、一般的な「誤判定」ソース、再生方法、修正計画の明確な説明です。
「ファイル名/mime文字列/ファイルパス」を$ image_typeとして間違えます
image_type_to_extension()は、 'image/jpeg' 、 'xxx.jpg' 、またはファイルパスではなく、整数定数( imageType_* )が必要です。
エラー例: image_type_to_extension( 'image/jpeg') → .jpgを返すことを望んでいます。実際にfalseまたはエラーが発生します。
$ image_typeの値ソースは正しくありません
正しい方法: exif_imageType($ file)またはgetTimagesize($ file)[2]を使用して、整数型値を取得します。
エラー: $ _files ['type'] (クライアントを偽造できます)またはfinfo_file()のmimeストリングから直接渡します。
返された.jpegおよび.jpgの期待は一貫していません
仕様上のjpegの拡張は.jpegまたは.jpgです。 image_type_to_extension(imageType_jpeg)デフォルトで.jpegを返します。
ビジネスで.jpgを使用する場合は、エイリアスを手動で変換する必要があります。
2番目のパラメーター$ include_dotは逆に理解されます
デフォルトのtrueは、点線の拡張機能( .pngなど)を返します。
いくつかはありません: image_type_to_extension($ t、false) → png 。
一般的な状況:スプライシングパスにドットを手動で追加すると、結果は... pngになります。
GD/拡張サポートは、予想される形式と一致しません
一部のタイプ(Webp、Avifなど)には、対応するGD/Imagicバージョンサポートが必要です。 image_type_to_extension()は拡張機能を与えることができますが、その後の保存関数( ImageWebpなど)は存在しないか、利用できない場合があり、「拡張機能が間違っていると思う」ことができます。
imageType_wbmp return .wbmpなどの他のタイプ、および多くの人々はそれが.bmpだと誤って考えています。
コンテンツは拡張機能と矛盾しています(間違った関数は執筆プロセスで使用されます)
PNGであることを検出しましたが、 ImageJPeg()を使用して保存し、ビットマップをJPEGに書き込み、 .png拡張子を取得し、ファイル「名前と現実は一致しません」を取得しました。
その逆:検出結果が保存機能と一致していることを確認してください。
finfo_file()からの直接マッピングの歪みを拡張するためのmime
FINFOは、Image/JPEGなどのMIMEを返します。文字列マッピングを実行すると、 Image/jpeg → .jpgを使用でき、 image_type_to_extension()は.jpegをgiveします。 「間違っている」ように見えますが、実際にはマッピングの一貫性がありません。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-string">'/path/to/uploaded/file'</span></span><span>;
</span><span><span class="hljs-comment">// 方法 A:より安定しています</span></span><span>
</span><span><span class="hljs-variable">$type</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">exif_imagetype</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>); </span><span><span class="hljs-comment">// 戻る IMAGETYPE_* 整数または false</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$type</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">RuntimeException</span></span><span>(</span><span><span class="hljs-string">'画像タイプを認識できません'</span></span><span>);
}
</span><span><span class="hljs-comment">// 方法 B:getimagesize</span></span><span>
</span><span><span class="hljs-variable">$info</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">getimagesize</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$info</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">RuntimeException</span></span><span>(</span><span><span class="hljs-string">'有効な写真ではありません'</span></span><span>);
}
</span><span><span class="hljs-variable">$type</span></span><span> = </span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-number">2</span></span><span>]; </span><span><span class="hljs-comment">// 同じ IMAGETYPE_* 整数</span></span><span>
</span></span>以下をimage_type_to_extension()に直接渡さないでください。
'image/png' (mime string)
'xxx.jpg' (ファイル名)
'/path/to/file' (パス)
多くのチームが望んでいます:
jpegは常に.jpgです( .jpegではありません)
ポイントを削除する(スプライシング用)
レアタイプのエイリアスを追加します
小さな関数をカプセル化できます:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">preferred_extension_from_file</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-variable">$includeDot</span></span><span> = </span><span><span class="hljs-literal">true</span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
</span><span><span class="hljs-variable">$type</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">exif_imagetype</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$type</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">InvalidArgumentException</span></span><span>(</span><span><span class="hljs-string">'画像タイプを認識できません:'</span></span><span> . </span><span><span class="hljs-variable">$file</span></span><span>);
}
</span><span><span class="hljs-variable">$ext</span></span><span> = </span><span><span class="hljs-title function_ invoke__">image_type_to_extension</span></span><span>(</span><span><span class="hljs-variable">$type</span></span><span>, </span><span><span class="hljs-variable">$includeDot</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$ext</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">RuntimeException</span></span><span>(</span><span><span class="hljs-string">'タイプの拡張機能をマッピングできません'</span></span><span>);
}
</span><span><span class="hljs-comment">// 統一されたケース</span></span><span>
</span><span><span class="hljs-variable">$ext</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-variable">$ext</span></span><span>);
</span><span><span class="hljs-comment">// ビジネス優先エイリアス</span></span><span>
</span><span><span class="hljs-variable">$map</span></span><span> = [
</span><span><span class="hljs-comment">// あなたが気にかけていることにのみ対処してください“スタイル”違い</span></span><span>
</span><span><span class="hljs-variable">$includeDot</span></span><span> ? </span><span><span class="hljs-string">'.jpeg'</span></span><span> : </span><span><span class="hljs-string">'jpeg'</span></span><span> => </span><span><span class="hljs-variable">$includeDot</span></span><span> ? </span><span><span class="hljs-string">'.jpg'</span></span><span> : </span><span><span class="hljs-string">'jpg'</span></span><span>,
</span><span><span class="hljs-variable">$includeDot</span></span><span> ? </span><span><span class="hljs-string">'.tiff'</span></span><span> : </span><span><span class="hljs-string">'tiff'</span></span><span> => </span><span><span class="hljs-variable">$includeDot</span></span><span> ? </span><span><span class="hljs-string">'.tif'</span></span><span> : </span><span><span class="hljs-string">'tif'</span></span><span>,
];
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$map</span></span><span>[</span><span><span class="hljs-variable">$ext</span></span><span>] ?? </span><span><span class="hljs-variable">$ext</span></span><span>;
}
</span></span>使用法:
<span><span><span class="hljs-variable">$ext</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preferred_extension_from_file</span></span><span>(</span><span><span class="hljs-string">'/uploads/a.tmp'</span></span><span>); </span><span><span class="hljs-comment">// 可能戻る .jpg</span></span><span>
</span><span><span class="hljs-variable">$extNoDot</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preferred_extension_from_file</span></span><span>(</span><span><span class="hljs-string">'/uploads/a.tmp'</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>); </span><span><span class="hljs-comment">// 可能戻る jpg</span></span><span>
</span></span>タイプの検出は最初のステップに過ぎず、より重要なことは、正しい書き込み関数を使用することです。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">save_image_as_detected</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$srcPath</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$destDir</span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
</span><span><span class="hljs-variable">$type</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">exif_imagetype</span></span><span>(</span><span><span class="hljs-variable">$srcPath</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$type</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">InvalidArgumentException</span></span><span>(</span><span><span class="hljs-string">'有効な写真ではありません:'</span></span><span> . </span><span><span class="hljs-variable">$srcPath</span></span><span>);
}
</span><span><span class="hljs-variable">$ext</span></span><span> = </span><span><span class="hljs-title function_ invoke__">image_type_to_extension</span></span><span>(</span><span><span class="hljs-variable">$type</span></span><span>); </span><span><span class="hljs-comment">// のように .png / .jpeg / .webp</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$ext</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">RuntimeException</span></span><span>(</span><span><span class="hljs-string">'拡張機能をマッピングできません'</span></span><span>);
}
</span><span><span class="hljs-comment">// タイプごとに対応する保存関数を選択します</span></span><span>
</span><span><span class="hljs-keyword">switch</span></span><span> (</span><span><span class="hljs-variable">$type</span></span><span>) {
</span><span><span class="hljs-keyword">case</span></span><span> IMAGETYPE_JPEG:
</span><span><span class="hljs-variable">$im</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatefromjpeg</span></span><span>(</span><span><span class="hljs-variable">$srcPath</span></span><span>);
</span><span><span class="hljs-variable">$filename</span></span><span> = </span><span><span class="hljs-title function_ invoke__">uniqid</span></span><span>(</span><span><span class="hljs-string">'img_'</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>) . </span><span><span class="hljs-string">'.jpg'</span></span><span>; </span><span><span class="hljs-comment">// ビジネスの好み:使用 .jpg</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagejpeg</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>, </span><span><span class="hljs-variable">$destDir</span></span><span> . </span><span><span class="hljs-string">'/'</span></span><span> . </span><span><span class="hljs-variable">$filename</span></span><span>, </span><span><span class="hljs-number">90</span></span><span>);
</span><span><span class="hljs-keyword">break</span></span><span>;
</span><span><span class="hljs-keyword">case</span></span><span> IMAGETYPE_PNG:
</span><span><span class="hljs-variable">$im</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatefrompng</span></span><span>(</span><span><span class="hljs-variable">$srcPath</span></span><span>);
</span><span><span class="hljs-variable">$filename</span></span><span> = </span><span><span class="hljs-title function_ invoke__">uniqid</span></span><span>(</span><span><span class="hljs-string">'img_'</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>) . </span><span><span class="hljs-string">'.png'</span></span><span>;
</span><span><span class="hljs-comment">// 少量の場合:開ける Alpha,圧縮を設定します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagesavealpha</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">imagepng</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>, </span><span><span class="hljs-variable">$destDir</span></span><span> . </span><span><span class="hljs-string">'/'</span></span><span> . </span><span><span class="hljs-variable">$filename</span></span><span>, </span><span><span class="hljs-number">6</span></span><span>);
</span><span><span class="hljs-keyword">break</span></span><span>;
</span><span><span class="hljs-keyword">case</span></span><span> IMAGETYPE_GIF:
</span><span><span class="hljs-variable">$im</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatefromgif</span></span><span>(</span><span><span class="hljs-variable">$srcPath</span></span><span>);
</span><span><span class="hljs-variable">$filename</span></span><span> = </span><span><span class="hljs-title function_ invoke__">uniqid</span></span><span>(</span><span><span class="hljs-string">'img_'</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>) . </span><span><span class="hljs-string">'.gif'</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">imagegif</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>, </span><span><span class="hljs-variable">$destDir</span></span><span> . </span><span><span class="hljs-string">'/'</span></span><span> . </span><span><span class="hljs-variable">$filename</span></span><span>);
</span><span><span class="hljs-keyword">break</span></span><span>;
</span><span><span class="hljs-keyword">case</span></span><span> IMAGETYPE_WEBP:
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">function_exists</span></span><span>(</span><span><span class="hljs-string">'imagecreatefromwebp'</span></span><span>) || !</span><span><span class="hljs-title function_ invoke__">function_exists</span></span><span>(</span><span><span class="hljs-string">'imagewebp'</span></span><span>)) {
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">RuntimeException</span></span><span>(</span><span><span class="hljs-string">'現在 GD サポートされていません WebP'</span></span><span>);
}
</span><span><span class="hljs-variable">$im</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatefromwebp</span></span><span>(</span><span><span class="hljs-variable">$srcPath</span></span><span>);
</span><span><span class="hljs-variable">$filename</span></span><span> = </span><span><span class="hljs-title function_ invoke__">uniqid</span></span><span>(</span><span><span class="hljs-string">'img_'</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>) . </span><span><span class="hljs-string">'.webp'</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">imagewebp</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>, </span><span><span class="hljs-variable">$destDir</span></span><span> . </span><span><span class="hljs-string">'/'</span></span><span> . </span><span><span class="hljs-variable">$filename</span></span><span>, </span><span><span class="hljs-number">85</span></span><span>);
</span><span><span class="hljs-keyword">break</span></span><span>;
</span><span><span class="hljs-keyword">default</span></span><span>:
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">RuntimeException</span></span><span>(</span><span><span class="hljs-string">'暂サポートされていません的图片类型:'</span></span><span> . </span><span><span class="hljs-variable">$type</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">imagedestroy</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$filename</span></span><span>;
}
</span></span>キーポイント:
検出結果は、保存関数と一致します(PNG→ ImagePNG 、JPEG→ ImageJPeg …)。
チームがunified.jpgの場合、ファイル名を生成するときにエイリアスを変換できますが、これはimage_type_to_extension()の返品値と競合しません。
MIMEを最初に摂取してから拡張することに慣れている場合は、MimeをImage_Type_To_Extension()に直接投げる代わりに、独自の高品質のマッピングテーブルを維持できます。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">ext_from_mime</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$mime</span></span><span>, </span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-variable">$includeDot</span></span><span> = </span><span><span class="hljs-literal">true</span></span><span>): ?</span><span><span class="hljs-title">string</span></span><span> {
</span><span><span class="hljs-built_in">static</span></span><span> </span><span><span class="hljs-variable">$map</span></span><span> = [
</span><span><span class="hljs-string">'image/jpeg'</span></span><span> => </span><span><span class="hljs-string">'jpg'</span></span><span>, </span><span><span class="hljs-comment">// ビジネスの好み</span></span><span>
</span><span><span class="hljs-string">'image/png'</span></span><span> => </span><span><span class="hljs-string">'png'</span></span><span>,
</span><span><span class="hljs-string">'image/gif'</span></span><span> => </span><span><span class="hljs-string">'gif'</span></span><span>,
</span><span><span class="hljs-string">'image/webp'</span></span><span> => </span><span><span class="hljs-string">'webp'</span></span><span>,
</span><span><span class="hljs-string">'image/bmp'</span></span><span> => </span><span><span class="hljs-string">'bmp'</span></span><span>,
</span><span><span class="hljs-string">'image/x-ms-bmp'</span></span><span> => </span><span><span class="hljs-string">'bmp'</span></span><span>,
</span><span><span class="hljs-string">'image/tiff'</span></span><span> => </span><span><span class="hljs-string">'tif'</span></span><span>,
</span><span><span class="hljs-string">'image/svg+xml'</span></span><span> => </span><span><span class="hljs-string">'svg'</span></span><span>,
</span><span><span class="hljs-string">'image/vnd.microsoft.icon'</span></span><span> => </span><span><span class="hljs-string">'ico'</span></span><span>,
];
</span><span><span class="hljs-variable">$ext</span></span><span> = </span><span><span class="hljs-variable">$map</span></span><span>[</span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-variable">$mime</span></span><span>)] ?? </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$ext</span></span><span> === </span><span><span class="hljs-literal">null</span></span><span>) </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$includeDot</span></span><span> ? (</span><span><span class="hljs-string">'.'</span></span><span> . </span><span><span class="hljs-variable">$ext</span></span><span>) : </span><span><span class="hljs-variable">$ext</span></span><span>;
}
</span></span>推奨戦略:
exif_imageType()またはgetImagesize() →を使用して、 imageType_* → image_type_to_extension()を取得します。
統一されたスタイル( .jpgなど)が必要な場合は、エイリアスマッピングのレイヤーを作成します。
必要に応じてFINFOを使用し、自己管理テーブルランディングエクステンションを使用します。
$ image_typeはexif_imageType() / getImagesize()[2]から来ていますか?
mime/file Pathはimage_type_to_extension()に誤って伝達されますか?
$ include_dotの意味を理解していますか(ドットはドットと一緒にいる必要があります)?
チームは.jpg / .jpegのスタイルを統合しましたか?マッピングは効果的ですか?
書き込み関数は、検出タイプ( ImageJPEG対ImagePngなど)と一致していますか?
環境はターゲット形式(Webp/AvifなどのGD機能)をサポートしていますか?
.wbmpを.bmpと間違えますか?
$ _files ['type'] (クライアントを偽造できます)の信頼を避けますか?
image_type_to_extension()自体は非常に「正直」です。いわゆる「エラー拡張機能の戻り」は、主に入力がImageType_*ではないため、チームの期待は仕様( .jpg対jpeg )と矛盾しているか、ライティングリンクが検出結果と一致しないためです。
パスを整理することにより、「タイプを正しく取得→[エイリアスを合理的にします]→[保存関数を一致させる]と、拡張機能の問題を完全に削除できます。