php에서 image_type_to_extension (int $ image_type, bool $ include_dot = true) : String | false는 종종 (예 : imageetype_png ) 를 확장자 (예 : .png )로 변환하는 데 사용됩니다.
그러나 실제 프로젝트에서 많은 학생들이 "잘못된 확장을 반환했다"고 피드백을받을 것입니다. 대부분의 경우 함수가 잘못된 것이 아니라 호출 방법이나 사전 판단에 문제가 있습니다.
다음은 일반적인 "잘못 판단"출처, 재생산 방법 및 수정 계획에 대한 명확한 설명입니다.
"파일 이름/마임 문자열/파일 경로" 를 $ 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 () 의 마임 문자열 에서 직접 전달하십시오.
.jpeg 및 .jpg 기대치는 일치하지 않습니다
사양에서 JPEG의 확장은 .jpeg 또는 .jpg 일 수 있습니다. image_type_to_extension (imageetype_jpeg)은 기본적으로 .jpeg를 반환합니다.
비즈니스에서 .jpg를 사용하는 경우 별명을 수동으로 변환해야합니다.
두 번째 매개 변수 $ 포함 _dot은 반대로 이해됩니다
기본 True는 점선 확장자 (예 : .png )를 반환합니다.
당신은 일부가 없습니다 : image_type_to_extension ($ t, false) → png .
일반적인 상황 : 스 플라이 싱 경로에 수동으로 점을 추가하면 결과가 PNG가 됩니다.
GD/확장 지원은 예상 형식과 일치하지 않습니다
일부 유형 (예 : Webp, AVIF)에는 해당 GD/Imagick 버전 지원이 필요합니다. image_type_to_extension () 은 확장자를 제공 할 수 있지만, 후속 저장 함수 (예 : ImageWebp )가 존재하지 않거나 사용할 수 없으므로 "확장이 잘못되었다고 생각할 수 없다"는데, 이는 저장 링크에서 본질적으로 지원되지 않습니다 .
ImageType_wbmp 와 같은 다른 유형은 .wbmp를 반환하고 많은 사람들이 실수로 .BMP 라고 생각합니다.
내용은 확장자와 일치하지 않습니다 (잘못된 기능은 쓰기 과정에서 사용됩니다)
PNG인지 감지했지만 ImageJPeg ()를 사용하여 저장하고 비트 맵을 JPEG에 작성한 다음 .png 확장자를 얻었고 "이름과 현실은 일치하지 않습니다".
그 반대도 : 감지 결과가 저장 기능 과 일치하는지 확인하십시오.
finfo_file () 에서 연장 된 직접 매핑 왜곡
FINFO는 이미지/JPEG 와 같은 모방을 반환합니다. 문자열 매핑을 직접 맵핑하면 이미지/jpeg → .jpg를 사용할 수 있으며 image_type_to_extension () 은 .jpeg를 제공합니다. "잘못된"것처럼 보이지만 실제로는 일치하지 않는 매핑입니다.
<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 () 에 다음을 직접 전달 하지 마십시오 .
'이미지/png' (Mime String)
'xxx.jpg' (파일 이름)
'/path/to/file' (Path)
많은 팀이 희망 :
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를 먼저 복용 한 다음 확장하는 데 더 익숙한 경우 image_type_to_extension () 에 직접 Mime을 던지는 대신 고품질 맵핑 테이블을 유지할 수 있습니다. :
<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>권장 전략 :
imageType_ * → im
통합 스타일 ( .jpg 등)이 필요한 경우 별칭 매핑 레이어를 만드십시오.
필요한 경우에만 FINFO를 사용하고 자체 관리 테이블 착륙장을 사용하십시오.
$ image_type 는 exif_imagetype () / getImagesize () [2] 에서 나옵니다.
MIME/파일 경로가 image_type_to_extension () 로 잘못 전송됩니까?
$ include_dot 의 의미를 이해합니까 (Dot이 dot과 함께 있어야 함)?
팀이 .jpg / .jpeg 의 스타일을 통일 했습니까? 매핑이 효과적입니까?
쓰기 기능이 감지 유형과 일치합니까 ( ImageJPeg vs ImagePng 등)?
환경이 대상 형식 (Webp/AVIF와 같은 GD 기능)을 지원합니까?
.BMP 로 .wbmp를 착각합니까?
$ _files [ 'type'] (클라이언트가 위조 될 수 있음)를 신뢰하지 않습니까?
image_type_to_extension () 자체는 매우 "정직한"것입니다. 소위 "오류 확장을 반환"하는 것은 대부분 입력이 imageType_* 가 아니기 때문에 팀의 기대치가 사양 ( .jpg vs.jpeg )과 일치하지 않거나 쓰기 링크가 감지 결과와 일치하지 않기 때문입니다.
경로를 정렬하면 " 올바르게 유형 가져 오기 → 별칭을 합리적으로 만듭니다 → 함수를 일치 "하면 확장 문제를 완전히 제거 할 수 있습니다.