今天学习的扩展其实现在已经是标准扩展了,为什么呢?因为Laravel框架在安装的时候是必须的扩展,如果不开启,连Laravel框架都无法使用。Fileinfo简介Fileinfo通过给定的魔法字节序列库获取文件的内容类型和编码。它获取的序列库依赖于操作系统。例如Linux系统默认使用文件/usr/share/misc/magic。其实我们可以通过这个扩展函数来获取文件的MIME信息,就像我们常见的image/png、text/html等内容一样。Fileinfo的这个扩展也兼容新旧开发模式,所以提供了面向过程和面向对象两种形式。我们先来看看如何使用面向对象的形式。面向对象使用$finfo=newfinfo(FILEINFO_MIME);echo$finfo->file("./1.PHP(3).php")中日期相关函数,PHP_EOL;//text/x-php;charset=us-asciiecho$finfo->buffer(file_get_contents("https://www.baidu.com"))."\n";//文本/html;charset=utf-8$finfo->set_flags(FILEINFO_EXTENSION);echo$finfo->file('timg.jpeg')。"\n";//jpeg/jpg/jpe/jfif首先我们通过一个新的finfo类获取一个文件操作对象,参数中的常量是可选的,默认是FILEINFO_NONE,表示不做特殊处理,这里我们根据RFC2045定义的格式,使用FILEINFO_MIME来表示返回文件的mime类型和编码。然后使用file()方法获取指定文件的mime信息。buffer()方法返回字符串内容的信息。比如我们获取一个网页信息的内容,我们可以得到它的字符串表示的文件编码格式为text/hmtl。set_flags()方法在实例化对象后可以修改其构造参数属性,即我们在实例化时设置的参数信息,这里我们修改为FILEINFO_EXTENSION,即让finfo对象返回文件名可能的扩展名。我们用一张图片进行了测试,返回的可能扩展包括评论中显示的那些。面向过程对于上面的面向对象代码,我们还展示了如何使用面向过程的函数进行相同的操作。$finfo=finfo_open(FILEINFO_MIME);echofinfo_file($finfo,"./1.PHP(3).php")中的日期相关函数,PHP_EOL;//text/x-php;charset=us-asciiechofinfo_buffer($finfo,file_get_contents("https://www.baidu.com")),PHP_EOL;//text/html;charset=utf-8finfo_set_flags($finfo,FILEINFO_EXTENSION);echofinfo_file($finfo,'timg.jpeg')。"\n";//jpeg/jpg/jpe/jfiffinfo_close($finfo);可以看出,这里是将finfo对象替换为finfo_open()方法获取一个finfo操作句柄。然后使用类似的finfo_file()、finfo_buffer()、finfo_set_flags()函数进行操作,效果和上面的面向对象结果一样。需要注意的是面向过程的写法有一个finfo_close()方法。一般handle类型的操作都有一个close函数来释放handle资源。就像mysqli这样的扩展一样,finfo也包含这样一个功能,并且只为进程提供这个功能。上面的finfo类中没有这样的close()方法。快速返回mime当然,Fileinfo扩展也为我们提供了快速返回文件mime信息的功能。我们可以轻松快速地获取文件的mime信息,而无需使用finfo对象或打开finfo句柄。echomime_content_type('./1.PHP(3).php'中的日期相关函数),PHP_EOL;//text/x-phpechomime_content_type('./timg.jpeg'),PHP_EOL;//image/jpeg但是PHP官方好像放弃了这个功能,现在又恢复了,也就是说不是特别推荐使用这个功能。在正式的开发过程中,我们还是不去理会,使用finfo对象或者finfo相关的函数来获取mime信息会比较靠谱。如果我们确定要判断的文件只是图片类型,那么我们还可以使用另一个函数来获取图片文件的mime。$image=exif_imagetype("./timg.jpeg");echoimage_type_to_mime_type($image),PHP_EOL;//image/jpeg总结了一个很简单但是很实用的功能,为什么实用呢?上传文件的安全问题可以通过它来解决。我们在上传文件时,通常会判断上传数组中文件的后缀名和文件的MIME类型。但是很多工具可以在上传过程中修改文件的MIME类型,即通过一些抓包工具修改Content-Type。但是通过Fileinfo扩展获取的文件必须是本地或者远程已经存在的文件,也就是说不会存在上传过程中修改传输信息导致的安全检查绕过问题。所以在Lavarl框架中,vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php类中的mimeType()方法使用finfo_file()函数获取文件的mime信息。在它的上传组件中,Laravel底层的symfony框架也使用了finfo_file()函数来对上传文件进行MIME判断,(vendor/symfony/mime/FileinfoMimeTypeGuesser.php)并没有直接使用.php中正常上传的$_FILES类型字段。测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/5。了解PHP中Fileinfo扩展的使用。PHP参考文档:https://www.php.net/manual/zh/book.fileinfo.php============各媒体平台均可搜索【硬核项目经理】
