首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PHP 如何优雅地获取文件扩展名?别再explode了

引言

通常文件扩展名在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 官方给定的方式,为啥不用?

Happy coding :_)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200613A0R6PX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券