在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;
    }
}