php文件上传代码标配的一个扩展了,为什么呢?(一)_php文件域上传
2022-05-02
今天来学习的扩展,其实是标准扩展php文件上传代码,为什么呢?因为框架在安装的时候是必要的扩展,如果不开启,连框架都无法使用。
简介
是通过给定的字节序列库获取文件的内容类型和编码。它获取的序列库是根据操作系统确定的。例如网站优化,系统默认使用文件/usr//misc/。其实我们可以通过这个扩展函数来获取文件的MIME信息,就像我们常见的/png和text/html内容一样。
此扩展同时兼容新旧开发模式,因此提供了面向过程和面向对象两种形式。下面我们来看看面向对象的表单是如何使用的。
面向对象的使用
$finfo = new finfo(FILEINFO_MIME);
echo $finfo->file("./1.PHP中的日期相关函数(三).php"), PHP_EOL;
// text/x-php; charset=us-ascii
echo $finfo->buffer(file_get_contents("https://www.baidu.com")) . "\n";
// text/html; charset=utf-8
$finfo->set_flags(FILEINFO_EXTENSION);
echo $finfo->file('timg.jpeg') . "\n";
// jpeg/jpg/jpe/jfif
首先,我们通过一个新的类来获取文件操作对象。参数中的常量是可选的。默认情况下,表示没有特殊处理。这里我们用它来表示文件的mime类型和编码。
然后使用file()方法获取指定文件的mime信息。 () 方法返回字符串内容的信息。例如,如果我们获取一个网页信息的内容,我们可以得到它的字符串表示的文件编码格式为 text/hmtl 。 () 方法是在实例化对象后修改其构造参数属性,也就是我们实例化时设置的参数信息,这里我们修改为 ,即让对象返回文件可能的扩展名。我们使用图片进行了测试,返回的可能扩展名包括评论中显示的扩展名。
面向过程
对于上面的面向对象代码,让我们也展示一下使用面向过程的函数如何进行相同的操作。
$finfo = finfo_open(FILEINFO_MIME);
echo finfo_file($finfo,"./1.PHP中的日期相关函数(三).php"), PHP_EOL;
// text/x-php; charset=us-ascii
echo finfo_buffer($finfo, file_get_contents("https://www.baidu.com")), PHP_EOL;
// text/html; charset=utf-8
finfo_set_flags($finfo, FILEINFO_EXTENSION);
echo finfo_file($finfo, 'timg.jpeg') . "\n";
// jpeg/jpg/jpe/jfif
finfo_close($finfo);
可以看出,这里是用()方法替换对象,获取操作句柄。然后使用类似的 () , () , () 函数进行操作,达到的效果和上面面向对象的结果是一样的。
需要注意的是,面向过程的写法有一个()方法。一般对句柄类型的操作都有一个关闭函数来释放句柄资源。就像一个扩展一样,它也包含这样一个功能,并且只为过程提供这个功能。上面的类中没有这样的()方法。
快速返回 mime
当然,扩展也为我们提供了一个快速返回文件mime信息的功能。我们可以在不使用对象或打开句柄的情况下快速轻松地获取文件的mime信息。
echo mime_content_type('./1.PHP中的日期相关函数(三).php'), PHP_EOL;
// text/x-php
echo mime_content_type('./timg.jpeg'), PHP_EOL;
// image/jpeg
不过PHP官方好像已经弃用了这个功能,不过现在已经恢复了,也就是说不特别推荐使用这个功能。在正式的开发过程中,大家不要太麻烦。使用对象或相关函数获取mime信息更可靠。
如果我们确定要判断的文件只是图片类型,那么我们也可以使用另外一个函数来获取图片文件的mime。
总结
很简单但是很有用的功能php文件上传代码,为什么有用呢?上传文件的安全问题可以通过它解决。我们在上传文件时,通常会在上传数组中判断文件的扩展名和文件的MIME类型。但是很多工具可以在上传过程中修改文件的MIME类型,即通过一些抓包工具修改-Type。但是通过扩展获取的文件必须是本地或远程存在的,也就是说不会出现上传过程中修改传输信息导致的安全检查绕过问题。
因此网站制作,在框架中, ///src///.php 类中的() 方法使用() 函数来获取文件的mime 信息。在其上传组件中,在底层框架中,对上传文件的MIME判断也是使用()函数,(//mime/ser.php)没有直接使用正常上传的$type字段。
测试代码:
学习在 PHP.php 中使用扩展
参考文件: