在php中如何只允许某些文件类型上传?

l7mqbcuq  于 2023-01-19  发布在  PHP
关注(0)|答案(5)|浏览(224)

我正在制作一个页面,用户可以在其中上传文件,如果文件类型是jpg、gif和pdf,我需要一个if语句来创建一个$error变量。
下面是我的代码:

$file_type = $_FILES['foreign_character_upload']['type']; //returns the mimetype

if(/*$file_type is anything other than jpg, gif, or pdf*/) {
  $error_message = 'Only jpg, gif, and pdf files are allowed.';
  $error = 'yes';
}

我在组织if语句时遇到了困难。我该怎么说呢?

but5z9lq

but5z9lq1#

将允许的类型放入数组中,然后使用in_array()

$file_type = $_FILES['foreign_character_upload']['type']; //returns the mimetype

$allowed = array("image/jpeg", "image/gif", "application/pdf");
if(!in_array($file_type, $allowed)) {
  $error_message = 'Only jpg, gif, and pdf files are allowed.';
  $error = 'yes';
}
u3r8eeie

u3r8eeie2#

编辑

我刚刚意识到你也想允许PDF文件。如果是这样的话,请查看PHP's Fileinfo class and functions。但是就安全性而言,你仍然不应该依赖$_FILES[]['type']:)
我将把其余部分留在这里,以防对发现此问题的其他人有所帮助
对于检查图像的mime类型,$_FILES[]['type']可能不安全。此数据由浏览器发送,很容易被欺骗。
如果你只想上传图片,你应该使用getimagesize()函数(尽管它的名字可能会让人误解),这个函数不仅会给你图片的大小,而且会给你所有你可能需要的关于图片的数据。
我在图像处理类中使用了以下脚本:

private function load_image_data($image_file) {

    // Firstly, to disambiguate a loading error with a nonexistant file error,
    // check to see if the file actually exists.
    if( ! file_exists($image_file) ) {
        throw new Nonexistent_Image_Exception("The file '{$image_file}' does not exist");
    }

    // We're going to check the return value of getimagesize, so we don't
    // need any pesky warnings or notices popping up, since we're going to
    // stop execution of this function if something goes wrong.
    $image_data = @getimagesize($image_file);

    if( $image_data === false ) {
        throw new Load_Image_Exception("Could not get image data from '{$image_file}'");
    }

    $this->size = new Dimensions($image_data[0], $image_data[1]);
    $this->mime = $image_data['mime'];

}

注意getimagesize()返回一个包含'mime'索引的关联数组,这里的数据是可靠的。
在另一个函数中,我检查了图像的mime类型,并使用适当的GD函数将其转换为PNG:

private function load_image($image_file) {

    // Suppress warning messages because we're going to throw an
    // exception if it didn't work instead.
    switch( $this->mime ) {
    case 'image/jpeg':
    case 'image/pjpeg':
        $this->image = @imagecreatefromjpeg($image_file);
        break;
    case 'image/gif':
        $this->image = @imagecreatefromgif($image_file);
        break;
    case 'image/png':
        $this->image = @imagecreatefrompng($image_file);
        break;
    default:
        throw new Invalid_Image_Exception("The image was of an invalid type");
    }

    if( $this->image === false ) {
        throw new Load_Image_Exception("Loading of image '{$image_file}' failed");
    }

}

你可能不需要做所有这些,但是你可以看到你指定的文件类型的mime类型,注意一个jpeg可能有两种不同的mime类型。
希望这个有用。

aor9mmx1

aor9mmx13#

请参阅Zend FrameworkZend_File_Transfer_Adapter_Http和Zend_Form_Element_File.您可以添加多个不同的验证器,如最小图像分辨率,MIME类型,最小文件大小,允许的文件扩展名等.

vwhgwdsa

vwhgwdsa4#

使用这个简单的代码...

<?
$path = $_FILES['file']['name']; // file means your input type file name
$ext = pathinfo($path, PATHINFO_EXTENSION);

if ($ext=="jpg" OR $ext=="jpeg" OR $ext=="gif" OR $ext=="png") {
    // your code here like...
    echo "Upload successful";
}else{
    // your invalid code here like...
    echo "Invalid image format. Only upload JPG or JPEG or GIF or PNG";
}
?>
jchrr9hc

jchrr9hc5#

您也可以在前端尝试过滤或允许您想要接受的文件类型。

<input type="file" name="file" accept="image/jpeg, image/gif, image/png" />

相关问题