如果您想从文件名(字符串)中获取扩展名,以下方法可以帮助您避免将字符串分割成各个部分的麻烦(请务必阅读 pathinfo 的文档警告)
<?php
$filename = "wallpaper.jpg";
$extension = pathinfo( $filename, PATHINFO_EXTENSION );
echo $extension; // "jpg"
?>
(PHP 5 >= 5.2.0, PHP 7, PHP 8)
image_type_to_extension — 获取图像类型的文件扩展名
返回给定IMAGETYPE_*
常量的扩展名。
一个包含与给定图像类型对应的扩展名的字符串,或者在失败时返回false
。
示例 #1 image_type_to_extension() 示例
<?php
// 创建图像实例
$im = imagecreatetruecolor(100, 100);
// 保存图像
imagepng($im, './test' . image_type_to_extension(IMAGETYPE_PNG));
imagedestroy($im);
?>
注意:
此函数不需要 GD 图像库。
如果您想从文件名(字符串)中获取扩展名,以下方法可以帮助您避免将字符串分割成各个部分的麻烦(请务必阅读 pathinfo 的文档警告)
<?php
$filename = "wallpaper.jpg";
$extension = pathinfo( $filename, PATHINFO_EXTENSION );
echo $extension; // "jpg"
?>
致:mail at spybreak dot de
我注意到你的解决方案适用于 mime_type_to_extension,但它有缺陷,因为 MIME 类型到扩展名的映射不是唯一的。请参阅我的示例,了解我观察到的情况。
此函数执行图像类型或 MIME 类型到扩展名的转换。受限于它不会尝试处理重复的 MIME 类型。并非完全准确!
<?php
if(!function_exists('image_type_to_extension')){
$extension;
function image_type_or_mime_type_to_extension($image_type, $include_dot) {
define ("INVALID_IMAGETYPE", '');
$extension = INVALID_IMAGETYPE; /// 无效输入的默认返回值
$image_type_identifiers = array ( ### 这些值对应IMAGETYPE常量
array (IMAGETYPE_GIF => 'gif', "mime_type" => 'image/gif'), ### 1 = GIF
array (IMAGETYPE_JPEG => 'jpg', "mime_type" => 'image/jpeg'), ### 2 = JPG
array (IMAGETYPE_PNG => 'png', "mime_type" => 'image/png'), ### 3 = PNG
array (IMAGETYPE_SWF => 'swf', "mime_type" => 'application/x-shockwave-flash'), ### 4 = SWF // A. 重复的MIME类型
array (IMAGETYPE_PSD => 'psd', "mime_type" => 'image/psd'), ### 5 = PSD
array (IMAGETYPE_BMP => 'bmp', "mime_type" => 'image/bmp'), ### 6 = BMP
array (IMAGETYPE_TIFF_II => 'tiff', "mime_type" => 'image/tiff'), ### 7 = TIFF (intel 字节序)
array (IMAGETYPE_TIFF_MM => 'tiff', "mime_type" => 'image/tiff'), ### 8 = TIFF (motorola 字节序)
array (IMAGETYPE_JPC => 'jpc', "mime_type" => 'application/octet-stream'), ### 9 = JPC // B. 重复的MIME类型
array (IMAGETYPE_JP2 => 'jp2', "mime_type" => 'image/jp2'), ### 10 = JP2
array (IMAGETYPE_JPX => 'jpf', "mime_type" => 'application/octet-stream'), ### 11 = JPX // B. 重复的MIME类型
array (IMAGETYPE_JB2 => 'jb2', "mime_type" => 'application/octet-stream'), ### 12 = JB2 // B. 重复的MIME类型
array (IMAGETYPE_SWC => 'swc', "mime_type" => 'application/x-shockwave-flash'), ### 13 = SWC // A. 重复的MIME类型
array (IMAGETYPE_IFF => 'aiff', "mime_type" => 'image/iff'), ### 14 = IFF
array (IMAGETYPE_WBMP => 'wbmp', "mime_type" => 'image/vnd.wap.wbmp'), ### 15 = WBMP
array (IMAGETYPE_XBM => 'xbm', "mime_type" => 'image/xbm') ### 16 = XBM
);
if((is_int($image_type)) AND (IMAGETYPE_GIF <= $image_type) AND (IMAGETYPE_XBM >= $image_type)){
$extension = $image_type_identifiers[$image_type-1]; // -1 因为$image_type_identifiers数组从[0]开始
$extension = $extension[$image_type];
}
elseif(is_string($image_type) AND (($image_type != 'application/x-shockwave-flash') OR ($image_type != 'application/octet-stream'))){
$extension = match_mime_type_to_extension($image_type, $image_type_identifiers);
}
else
{
$extension = INVALID_IMAGETYPE;
}
if(is_bool($include_dot)){
if((false != $include_dot) AND (INVALID_IMAGETYPE != $extension)){
$extension = '.' . $extension;
}
}
else
{
$extension = INVALID_IMAGETYPE;
}
return $extension;
}
}
function match_mime_type_to_extension($image_type, $image_type_identifiers){
// 匹配时退出循环
foreach($image_type_identifiers as $_key_outer_loop => $_val_outer_loop){
foreach($_val_outer_loop as $_key => $_val){
if(is_int ($_key)){ // 记录扩展名以进行mime检查
$extension = $_val;
}
if($_key == 'mime_type'){
if($_val === $image_type){ // 找到匹配项,无需继续循环
return $extension; ### 返回
}
}
}
}
// 比较所有值,没有匹配项
return $extension = INVALID_IMAGETYPE;
}
$extension = image_type_or_mime_type_to_extension($image_type, $include_dot);
return $extension;
}
?>
// 如果你只想从文件路径名中查找格式,而无需创建任何图像
// 图片路径名
$image_name = "image name.png";
// 最后一点之后自然就是格式。
$dots = explode(".",$image_name);
// 我们将$dots的最后数据赋值给变量$type。
$type = $dots[(count($dots)-1)];
// 输出将不带点。
echo "without dot : ".$type;
// 带点的
$type = ".".$type;
echo "dotted : ".$type;
当我为我的照片网站编写脚本时,需要编写这样一个函数,它可以获取上传文件(图像)的扩展名,所以这个函数是
<?php
function get_extension($imagetype)
{
if(empty($imagetype)) return false;
switch($imagetype)
{
case 'image/bmp': return '.bmp';
case 'image/cis-cod': return '.cod';
case 'image/gif': return '.gif';
case 'image/ief': return '.ief';
case 'image/jpeg': return '.jpg';
case 'image/pipeg': return '.jfif';
case 'image/tiff': return '.tif';
case 'image/x-cmu-raster': return '.ras';
case 'image/x-cmx': return '.cmx';
case 'image/x-icon': return '.ico';
case 'image/x-portable-anymap': return '.pnm';
case 'image/x-portable-bitmap': return '.pbm';
case 'image/x-portable-graymap': return '.pgm';
case 'image/x-portable-pixmap': return '.ppm';
case 'image/x-rgb': return '.rgb';
case 'image/x-xbitmap': return '.xbm';
case 'image/x-xpixmap': return '.xpm';
case 'image/x-xwindowdump': return '.xwd';
case 'image/png': return '.png';
case 'image/x-jps': return '.jps';
case 'image/x-freehand': return '.fh';
default: return false;
}
}
?>
这对在服务器上上传文件的用户很有用。
2006-09-29
关于此页面上的一些贡献,有一些说明。
1.在我看来,所有模拟“image_type_to_extension”函数的方案都或多或少地达不到目标(参见我下面的评论)。这就是为什么我编写了自己的函数并提交到此页面下方的原因。关于我的工作,任何评论、发现的错误或改进都将不胜感激。
2.避免以非常规的方式使用Switch语句来“Break”(我注意到使用了return语句!)。即使在代码的初始阶段它什么也不做——仍然要加上default case(它让其他人意识到不需要default case,或者最坏的情况是忘记了它)。
3.在受你控制的环境中,通过扩展名或MIME类型确定内容的风险似乎是解决问题的有吸引力的方案。但是,在现实世界中,不能保证MIME类型或文件扩展名与其关联的文件正确。
考虑使用函数来获取图像类型
getimagesize 或(无需GD即可使用)
exif_imagetype
4.编码不仅仅是把东西组合在一起完成工作!!!但是无论做什么都是值得的——因此脏话在这个论坛里没有位置!!
5.“oridan at hotmail dot com” 的想法非常巧妙。我将仔细研究这个想法,用于我自己的项目。