在php中上载文件之前,请检查图片文件类型和大小
我有以下代码:在php中上载文件之前,请检查图片文件类型和大小,php,Php,我有以下代码: $filecheck = basename($_FILES['imagefile']['name']); $ext = substr($filecheck, strrpos($filecheck, '.') + 1); if (($ext == "jpg" || $ext == "gif" || $ext == "png") && ($_FILES["imagefile"]["type"] == "image/jpeg" || $_FILES["image
$filecheck = basename($_FILES['imagefile']['name']);
$ext = substr($filecheck, strrpos($filecheck, '.') + 1);
if (($ext == "jpg" || $ext == "gif" || $ext == "png") && ($_FILES["imagefile"]["type"] == "image/jpeg" || $_FILES["imagefile"]["type"] == "image/gif" || $_FILES["imagefile"]["type"] == "image/png") &&
($_FILES["imagefile"]["size"] < 2120000)){
} else {
echo "F2";
die();
}
$filecheck=basename($_FILES['imagefile']['name']);
$ext=substr($filecheck,strrpos($filecheck,'.')+1);
如果($ext==“jpg”| |$ext==“gif”| |$ext==“png”)和($_文件[“imagefile”][“type”]==“image/jpeg”|$|文件[“image/gif”|$|文件[“imagefile”][“type”]=“image/png”)和
($_文件[“图像文件”][“大小”]<2120000)){
}否则{
回声“F2”;
模具();
}
我需要做的是检查上传的文件是否是jpg/gif/png,并且大小是否小于2兆
如果它大于2兆,或者不是正确的文件类型,我需要返回/echo F2(api的错误代码)
当我使用上面的代码处理70k jpg文件时,它返回F2
子注释
im上传的图片扩展名为.JPG。案例可能是一个因素吗?如果是,我该如何适应
子说明im上传的图片扩展名为.JPG。案例可能是一个因素吗?如果是,我该如何适应
是的,这就是问题所在。您应该将strtolower()添加到此行:
$ext = substr($filecheck, strrpos($filecheck, '.') + 1);
比如:
$ext=strtolower(substr($filecheck,strrpos($filecheck,'.')+1)
这将解决您当前的问题。但是从技术上讲,您不应该担心文件扩展名,您应该只需要检查MIME类型像
$ext==“jpg”
这样的比较只需要检查$ext
是否正好是“jpg”
在进行这些比较之前,您可能希望在$ext上使用,以处理“.JPG”情况
如果您正在使用PHP=5.3,您可能需要考虑新的扩展,并且它的函数
对于文件大小,您已经在使用
$\u文件[“imagefile”][“size”]
;那没关系,我想,但你只有在上传文件后才会知道——不过,恐怕在上传之前没有真正的方法检查这类事情
在上传文件之前,您可能会找到一些JS代码来对扩展名进行第一次预检查——但您仍然需要在服务器端进行检查,因为客户端所做的任何事情本身都是不安全的 但是,不确定您是否可以对文件大小执行相同的操作 某些浏览器可能支持一个名为
MAX\u FILE\u SIZE
的隐藏字段(请参阅有关的文档);但不确定它是否得到了真正的支持(实际上从未见过它被使用过;所以可能不是:-()
作为旁注,您可能需要进行配置,因此它允许上传的大小至少与您想要的一样大(默认情况下,它通常设置为2MB;因此应该已经可以了)请注意,您可能不希望依赖文件扩展名来确定文件类型。例如,对于某人来说,上载具有
.png
扩展名的可执行文件相当容易。恶意客户端也很容易伪造mime类型以作为图像传递。依赖该信息存在安全风险
如果浏览器提供此信息,则为文件的mime类型。例如“image/gif”。但是,此mime类型未在PHP端进行检查,因此不要将其值视为理所当然 尝试使用
gd
()加载图像,以确保它们实际上是有效的图像(而不仅仅是假装具有图像文件头的随机文件…finfo_文件
依赖于这些头)
如果确实必须使用扩展名来验证文件是否为图像,请使用将扩展名转换为小写
$filecheck = basename($_FILES['imagefile']['name']);
$ext = strtolower(substr($filecheck, strrpos($filecheck, '.') + 1));
if (!(($ext == "jpg" || $ext == "gif" || $ext == "png") && ($_FILES["imagefile"]["type"] == "image/jpeg" || $_FILES["imagefile"]["type"] == "image/gif" || $_FILES["imagefile"]["type"] == "image/png") &&
($_FILES["imagefile"]["size"] < 2120000))){
echo "F2";
die();
}
$filecheck=basename($_FILES['imagefile']['name']);
$ext=strtolower(substr($filecheck,strrpos($filecheck,'.')+1);
如果(!($ext==“jpg”| |$ext==“gif”| |$ext==“png”)和($文件[“imagefile”][“type”]=“image/jpeg”|$文件[“type”]=“image/gif”|文件[“imagefile”][“type”]=“image/png”)和
($_文件[“图像文件”][“大小”]<2120000))){
回声“F2”;
模具();
}
Php是一种服务器端脚本语言,如果图片位于客户端,在上传之前,您不能通过Php检查图片大小。您需要两件事:
使扩展名检查不区分大小写:
if($strtolower($ext == "jpg")){
// do your stuff
}
检查文件是否确实包含图像。执行此操作的简单方法是fileinfo:
$finfo = finfo_open(FILEINFO_MIME_TYPE);
echo finfo_file($finfo, $filename);
$finfo_close($finfo);
另一种检查文件是否真的是图像的方法是在像gd这样的图像库中加载。如果您的文件可以成功加载,则它是图像
请记住,jpeg图像可以具有
.jpg
或.jpeg
扩展名。请注意,对于Internet Explorer,
他们提交JPEG文件的mime类型为image/pjpeg——这与其他浏览器不同
下面是一个简单的函数,用于根据文件扩展名获取mime类型:
function mime2ext($mime){ // mime is like image/jpeg
$m = explode('/',$mime);
$mime = $m[count($m)-1]; // get the second part of the mime type
switch($mime){
case 'jpg':
case 'jpeg':
case 'pjpeg':
return 'jpg';
break;
case 'png':
return 'png';
break;
case 'gif':
return 'gif';
break;
}
return '';
}
文件大小是相当明显的,但人们在上面所做的检查格式是否正确的工作有点低效,而且“不安全” 我是这样做的:
if($_FILES["userPicture"]["error"] == 0) {
// File was uploaded ok, so it's ok to proceed with the filetype check.
$uploaded_type = exif_imagetype($_FILES["userPicture"]["tmp_name"]);
// What we have now is a number representing our file type.
switch($uploaded_type) {
case "1":
$uploaded_type = "gif";
break;
case "2":
$uploaded_type = "jpg";
break;
case "3":
$uploaded_type = "png";
break;
}
}
更多信息,请访问;编辑:这具有“在每个浏览器中”工作的优点,因为它不依赖于文件名或用户提供的任何内容,除了文件数组值“error”告诉我们没有真正的错误。回答您的子注释:
$ext=strtolower(substr($filecheck,strrpos($filecheck,'.')+1))
MIME类型确实如此。文件也可以命名为.jpeg。依赖于该信息存在安全风险。请阅读我下面的答案。非常好的一点-可以使用一些javascript检查文件大小,并拒绝使用,而文件类型可以通过@Andrew Moore的答案在脚本内部进行检查
if($_FILES["userPicture"]["error"] == 0) {
// File was uploaded ok, so it's ok to proceed with the filetype check.
$uploaded_type = exif_imagetype($_FILES["userPicture"]["tmp_name"]);
// What we have now is a number representing our file type.
switch($uploaded_type) {
case "1":
$uploaded_type = "gif";
break;
case "2":
$uploaded_type = "jpg";
break;
case "3":
$uploaded_type = "png";
break;
}
}