Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
拍照的最佳方式';PHP中的文件扩展名类型_Php - Fatal编程技术网

拍照的最佳方式';PHP中的文件扩展名类型

拍照的最佳方式';PHP中的文件扩展名类型,php,Php,我正在我的网站上重新建立我的照片上传部分,我正在努力学习尽可能多的东西,这样我就可以安全地完成这项工作,而且性能最好。我的网站通常每分钟上传15-20张照片 那么,这种方法获取照片的文件类型(如jpg、gif、png)可靠吗 $fileType = $_FILES['image']['type']; 如前所述 如果浏览器提供此信息,则文件的mime类型。[…]但是,此mime类型未在PHP端进行检查,因此不要将其值视为理所当然 换句话说,你不应该相信它,因为我可以上传任何我想要的东西,让它看

我正在我的网站上重新建立我的照片上传部分,我正在努力学习尽可能多的东西,这样我就可以安全地完成这项工作,而且性能最好。我的网站通常每分钟上传15-20张照片

那么,这种方法获取照片的文件类型(如jpg、gif、png)可靠吗

 $fileType = $_FILES['image']['type'];
如前所述

如果浏览器提供此信息,则文件的mime类型。[…]但是,此mime类型未在PHP端进行检查,因此不要将其值视为理所当然

换句话说,你不应该相信它,因为我可以上传任何我想要的东西,让它看起来像jpeg

为了确保上传的文件实际上是一个图像,我过去一直使用它,效果非常好。GD可能具有相同的可用功能


或者,您可以使用fileinfo扩展名获取mime类型的服务器端,更具体地说,是文件扩展名,或者至少可以。最好不要依赖/信任用户提交的数据。此外,如PHP手册所述:

$\u文件['userfile']['type']- 文件的mime类型(如果浏览器提供此信息)。例如“image/gif”。但是,这个mime类型在PHP端没有被检查,因此不要认为它的值是理所当然的

这是不可靠的

这里有一个更好的方法:

PHP函数返回一个数字索引的图像数据数组,索引2是指示图像类型的IMAGETYPE_XXX常量()之一。然后,可以在许多GD系列函数中使用这些函数,两个相关的函数是and

因此,您可以很容易地按照以下思路做一些事情:

$imageData = getimagesize($_FILES['userfile']['tmp_name']);
// $imageData[2] will contain the value of one of the constants
$mimeType = image_type_to_mime_type($imageData[2]);
$extension = image_type_to_extension($imageData[2]);
尽管如此,如果您有可用的
exif
扩展名,
[exif\u imagetype()][5]
函数将返回与
getimagesize()
的索引2完全相同的结果,但速度要快得多

我使用GD方法作为我的主要示例,因为它们在PHP安装中更常见。但是Imagick扩展也提供了类似的功能,您还可以使用
fileinfo
扩展来验证mime类型(从5.3开始附带)。

()是检查给定文件是否为有效图像文件的最安全、最快和最可靠的方法,它还可用于远程URL

返回值与getimagesize()在索引2中返回的值相同 但是exif_imagetype()要快得多。

$type=@exif\u imagetype($\u FILES['image']['tmp\u name']);

如果($type>=1)和($type首先尝试
getimagesize
exif\u imagetype()

如果它没有返回
['mime']
,请尝试
finfo\u文件
(如果
扩展名加载('fileinfo')

如果仍然没有结果,请尝试
mime\u content\u type
(如果
function\u存在('mime\u content\u type')


如果你不想要mime类型,但只需要文件扩展名,请使用
pathinfo($path,pathinfo\u扩展名)
+1,doh,你比我强。getimagesize是我会使用的。image\u type\u to\u扩展名:“此函数不需要GD图像库。”+1因为尽可能使用Imagick函数而不是GD函数,因为它们的性能更高。使用pathinfo($path,pathinfo_扩展名)。用户名不能使用带有jpg扩展名的php文件,系统会认为它是jpg?
image_type_to_扩展名(exif_imagetype('your_file_name'));
将输出文件的.extension'('.png'、'.jpeg'等),即使它不是文件名-
exif_imagetype()
从文件开头的文件签名中读取类型。
$type = @exif_imagetype($_FILES['image']['tmp_name']);

if (($type >= 1) && ($type <= 3))
{
    echo 'Valid image (GIF, JPG or PNG).';
}

else
{
    unlink($_FILES['image']['tmp_name']); // delete it
}