引言

通常文件扩展名在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 :_)

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

c++如何获取文件时间_3分钟短文 | PHP 如何优雅地获取文件扩展名?别再explode了相关推荐

  1. laravel artisan 后台运行_3分钟短文:Laravel用户自定义命令行简明教程

    引言 完成一个功能需求,有时候并不需要一个界面UI,比如定时任务,后台任务, 对于这类任务往往比较耗时,在一个web页面生命周期内,要拖的很久.这时候我们 需要将其放在后台交给操作系统执行. 本期说一 ...

  2. 语句作用_3分钟短文:Laravel模型作用域,为你“节省”更多代码

    引言 原则上代码写一次,处处是引用,不需要大量的冗余代码,这是一种趋势,也是提高代码健壮性的努力方向. laravel模型为我们提供了一层数据库操作层,将数据交互独立出来. 但是久而久之,随着项目的需 ...

  3. sql查询无结果返回空_3分钟短文 | Laravel 查询结果检查是不是空,5个方法你别用错...

    引言 Laravel 提供了 Eloquent ORM 对象用于操作数据库,将其进行抽象方便操作. 因为设计的灵活度,大家在使用Model查询数据集的时候,会面临结果为空,记录不存在的问题, 那么如何 ...

  4. php 时间格式化_3分钟短文 | PHP获取函数的代码片段,唯有反射最高效

    引言 为了演示上一篇我们所说的PHP中反射的应用,本篇接着讲反射的应用.因为其特性,是操作函数和方法的,是函数的操作者,类的操作者,所以显得格外重要. 我们从一个小需求出发,假如有一段这样的代码: f ...

  5. request用法_3分钟短文:说说Laravel页面会话之间的数据保存Session用法

    引言 我们知HTTP请求是没有状态的,两个请求之间没有直接的关联关系.但大多数情况下, 我们需要保持用户的会话间数据的连续性,这时,为了数据安全起见, 有必要在服务器上临时存储一些上下文数据了. 这就 ...

  6. 加密生成指定长度_3分钟短文 | PHP伪随机Token生成器,实地测试,效果感人!

    引言 我们经常可能会用到邀请码,邮件验证码,或者需要使用unique 字符串标记用户属性的情况. 今天我们且不说高深的"全局唯一ID"的生成方案,我们说一个简单的,如何生成一个唯一 ...

  7. laravel $request 多维数组取值_3分钟短文:Laravel的“南天门”,过滤掉七七八八的数据...

    引言 上一章我们教会大家如何从用户表单内正确地获取数据,可是没有讲,获取到的数据到底有啥用,或者说,有的用户提交的数据压根儿就没正经填,那些错乱无效的数据,如果直接放到数据库,纯粹是对数据库的污染. ...

  8. php正则匹配域名不包含端口_3分钟短文 | PHP极速匹配子字符串,你是怎么做的?...

    引言 在项目开发中我们经常会遇到这样的需求,比如用户提交的表单中含有一些文本的内容.我们需要在后台为其进行关键词过滤处理. 那么问题来了,如何在海量的字符串中快速的匹配一些子字符串呢?今天我们就给大家 ...

  9. group by很多字段是不是会很慢_3分钟短文 | MySQL在分组时,把多列合并为一个字段!

    引言 今天我们来说一个MySQL查询的例子,比如有一个统计需求, 分组后的数据,我们知道只能使用聚合函数进行统计, 那如果要根据分组约定,将一系列的值合并到单个字段显示出来, 应该怎么写呢? 学习时间 ...

最新文章

  1. 一个学术 导航网站----科塔学术
  2. [JavaWeb-MySQL]数据库的备份和还原
  3. 牛客题霸 [判断回文] C++题解/答案
  4. Python中类与对象的关系
  5. Spring学习总结(5)——IOC注入方式总结
  6. 蓝桥杯 ALGO-123 算法训练 A+B problem
  7. linux mysql恢复数据_Mysql数据恢复和备份
  8. oracle连表图解,oracle 表连接方式解析
  9. CSS3:伪类前的冒号和两个冒号区别
  10. 无法进入一个空框_DeNoise AI无法从Photoshop作为插件启动?
  11. 研究WPS Office的LINUX postinst脚本,发现了错误,应该学习柳氏风格
  12. 入门神经网络优化算法(五):一文看懂二阶优化算法Natural Gradient Descent(Fisher Information)
  13. 兔子、狼、狐狸、王八
  14. 制作自定义springboot banner
  15. Excel中vlookup模糊查找的妙用(模糊匹配)
  16. Pytorch实战3:DCGAN深度卷积对抗生成网络生成动漫头像
  17. 黑名单挂断电话及删除电话记录
  18. 8255a初始化c语言程序,单片机8255型号大全(工作字的选择,单片机连接,初始化程序分析)...
  19. 羽素登陆《岭南大医生》专业顾问带你避雷护肤误区
  20. Linux——vim/vi文本编辑器

热门文章

  1. 放大镜_医用手术放大镜
  2. MySQL条件判断函数使用
  3. 微信小程序uni.getImageInfo踩坑大计划
  4. python打印进程号与线程号
  5. PyCharm Active Code Generator
  6. mysql--MySQL数据库的简单认识
  7. SpringMVC 控制器默认支持GET和POST两种方式
  8. loadrunner录制回放常见问题及解决办法
  9. 关于 iOS 证书,你必须了解的知识
  10. [JZOJ P1281] [DP]背包的第k优解