在php中上传文件之前检查图片文件的类型和大小

mrp*_*atg 5 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["imagefile"]["type"] == "image/gif" || $_FILES["imagefile"]["type"] == "image/png") && 
    ($_FILES["imagefile"]["size"] < 2120000)){
} else {
echo "F2";
die();
}
Run Code Online (Sandbox Code Playgroud)

我需要做的是检查上传的文件是否是jpg/gif/png并且其大小小于2兆.

如果它大于2兆,或者不是正确的文件类型,我需要返回/ echo F2(api的错误代码).

当我使用上面的代码处理70k jpg文件时,它返回F2.

SUBNOTE 图片即时上传的扩展名为.JPG.案件可能是一个因素吗?如果是这样,我如何适应?

And*_*ore 22

请注意,您可能不希望依赖文件扩展名来确定文件类型..png例如,某人上传具有扩展名的可执行文件相当容易.恶意客户端也可以轻易伪造mime-type作为图像传递.依赖该信息是一种安全风险.

PHP文档:
如果浏览器提供此信息,则为文件的mime类型.一个例子是"image/gif".但是,在PHP端没有检查这个mime类型,因此不会将其值视为理所当然.

尝试使用gd(getimagesize())加载图像以确保它们实际上是有效的图像(而不仅仅是假装有图像文件标题的随机文件...... finfo_file依赖于这些标题).

if($_FILES["imagefile"]["size"] >= 2120000) {
  echo "F2";
  die();
} else {
    $imageData = @getimagesize($_FILES["imagefile"]["tmp_name"]);

    if($imageData === FALSE || !($imageData[2] == IMAGETYPE_GIF || $imageData[2] == IMAGETYPE_JPEG || $imageData[2] == IMAGETYPE_PNG)) {
      echo "F2";
      die();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您确实必须使用扩展来验证文件是否是图像,请使用strtolower()将扩展名设置为小写.

$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();
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ark 5

SUBNOTE图片即时上传的扩展名为.JPG.案件可能是一个因素吗?如果是这样,我如何适应?

是的,这就是问题所在.你应该在这一行添加strtolower():

$ext = substr($filecheck, strrpos($filecheck, '.') + 1);
Run Code Online (Sandbox Code Playgroud)

喜欢:

$ ext = strtolower(substr($ filecheck,strrpos($ filecheck,'.')+ 1));

这将解决您当前的问题.但从技术上讲,你不应该担心文件扩展名,你应该只需要检查MIME类型


Pas*_*TIN 5

比较$ext == "jpg"只是检查$ext是否正好是"jpg".

在进行这些比较之前,您可能希望在$ ext上使用strtolower来处理".JPG"情况.


如果您使用的是PHP <= 5.2,则可能需要使用mime_content_type来检查文件的内容类型,而不是依赖于$_FILES['imagefile']['name']和/或$_FILES["imagefile"]["type"]都是由客户端发送的 - 并且因此可能是伪造的.

如果你正在使用PHP> = 5.3,你可能要考虑新的扩展FileInfo的,它的finfo_file功能


对于文件的大小,您已经在使用$_FILES["imagefile"]["size"]; 没错,我猜,但是你只会在上传文件时知道 - 但是,在上传之前没有真正的方法来检查那种东西,我担心......


你可能能够找到一些JS代码在文件上传之前对扩展进行第一次预检 - 但是你仍然需要检查服务器端,因为客户端做的任何事情本身都不安全.

不确定你可以对文件的大小做同样的事情,但是......

某些浏览器可能支持一个名为的隐藏字段MAX_FILE_SIZE(请参阅有关文件上载的文档); 但不确定它是否真的得到支持(实际上从未见过它;所以可能不是:-()


作为旁注,您可能希望配置upload_max_filesize,因此它允许上传至少与您想要的一样大(默认情况下,它通常设置为2MB;所以应该已经可以了)