引言
通常文件扩展名在Linux系统上是没有意义的,仅是用来标记该文件属于哪种类型?但是大多数,我们从浏览器上访问Web程序。提交给服务器的文件是带有扩展名的,比如,图片上传,文件上传就是比较经典的一些应用。
那么在编程中如何准确获取文件的扩展名,并根据分类做相应的处理呢?实现的方法有很多。今天我们给大家介绍一些最佳实践。
一个粗糙的示例
获取一张上传图片的扩展名,有些同学可能会这样写:
$userfile_name=$_FILES[image][name];$userfile_extn=explode(.,strtolower($_FILES[image][name]));
那么直接对文件名进行explode,裁切出来的是一个属组。假设我们管控上传文件的最后一个字段是文件的扩展名,那么该文件的扩展名就是end($userfile_extn)。
这样的实现方法完美吗?有更好的吗?
如果文件名字符串比较特殊,这样的程序会不会explode失败返回False?从而抛出异常?
有可能会!所以这个写法是有bug的。
PHP都准备好函数了!
PHP是一个工具箱,内置了无数实用的函数。有一个函数就是专门设计来解决这个需求的:pathinfo。下面是用法:
$path=$_FILES[image][name];$ext=pathinfo($path,PATHINFO_EXTENSION);
瞬间就感觉香多了。
还是得多看文档,我把这个函数的参数和用法贴在下面。
所以说尽量不要重复造轮子。官方写好的轮子拿来用就是,它就静静的躺在帮助手册里等着你去发现。
轮子哥
当然程序都是活的。因为我开发者,给出别的解决方案无可厚非。用PHP自带的函数实现这个功能本来就有N多个办法。下面我们贴几个看起来还不错的轮子。最起码容错性比最上面的那个写法高一些。
比如使用strrpos+substr实现的:
$userfile_name=$_FILES[image][name];$userfile_extn=substr($userfile_name,strrpos($userfile_name,.)+1);
通过查找“.”所在的位置,并向后一位开始截取到字符串末尾。这个写法避免了explored截取数组失败,从而返回false这个bug。
再比如,有开发者人为你只是要图片的扩展名,那么大可以直接使用image相关的函数getimagesize:
$image=getimagesize($_FILES[image][tmp_name]);
getimagesize()函数将测定任何GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM或WBMP图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通HTML文件中IMG标记中的height/width文本字符串。
如果不能访问filename指定的图像或者其不是有效的图像,getimagesize()将返回FALSE并产生一条E_WARNING级的错误。
上述写法中,如果$image不为false,那么就是一个属组,其中键mime返回的就是图片文件类型image/jpeg这样的字符串。
但是没什么LUAN用!
写在最后
比较来比较去,还是pathinfo最香。
因为这就是PHP官方给定的方式,为啥不用?
Happycoding:_)
我是
程序员小助手,持续分享编程知识,欢迎