1

如何检查文件扩展名和 mime 类型是否在数组中,这是我目前拥有的代码。

$upload_project_thum = $_FILES['upload_project_thum']['name'];
$upload_project_thum_ext = substr($upload_project_thum, strrpos($upload_project_thum, '.') + 1);    
$upload_permitted_types= array('image/jpeg:jpg','image/pjpeg:jpg','image/gif:gif','image/png:png');

然后在我检查文件是否是有效类型的地方我有这个foreach循环

foreach ($upload_permitted_types as $image_type) {
        $type = explode(":", $image_type);
            if (($type[0] != $_FILES['upload_project_thum']['type']) &&  ($upload_project_thum_ext != $type[1]) ) {
                $errmsg_arr[] = 'Please select a jpg, jpeg, gif, or png image to use as the project thumbnail'. $type[1] . " Type: ". $type[0];
                $errflag = true;
        }  

问题是,如果文件类型不是数组中的所有类型(这是不可能的),我会收到错误消息。它的工作原理是,如果上传文件在数组中,则不会触发错误消息。

4

4 回答 4

1
if (!in_array($_FILES['upload_project_thum']['type'], $upload_permitted_types)){

   exit("Unsupported file type");
}
于 2009-09-30T04:10:01.057 回答
1
if( !in_array( $_FILES['upload_project_thum']['type'] . ':' . $upload_project_thum_ext, $upload_permitted_types) ) {
    Trigger-error-here;
}

这应该寻找从类型和扩展名粘合的适当字符串。

另一种方法是像这样修改你的循环:

$is_allowed = false;
foreach ($upload_permitted_types as $image_type) {
    $type = explode(":", $image_type);
    if (($type[0] == $_FILES['upload_project_thum']['type']) && ($type[1] == $upload_project_thum_ext ) ) {
        $is_allowed = true;
        break;
    }
}

if( !$is_allowed ) {
        $errmsg_arr[] = 'Please select a jpg, jpeg, gif, or png image to use as the project thumbnail'. $type[1] . " Type: ". $type[0];
        $errflag = true;
}
于 2009-10-01T10:02:12.643 回答
1

我现在这样做的方式是:

    $upload_permitted_types['mime']= array('image/jpeg','image/gif','image/png');
$upload_permitted_types['ext']= array('jpeg','jpg','gif','png');

if(!in_array($_FILES['upload_project_thum']['type'],$upload_permitted_types['mime']) || !in_array($upload_project_thum_ext,$upload_permitted_types['ext'])
{
       $errmsg_arr[] = 'Please select a jpg, jpeg, gif, or png image to use as the project thumbnail';
       $errflag = true;
}

这样做的好处是它允许一个带有 jpeg mime 的 .gif 文件。因此,它不会强制地雷和扩展名匹配,但会确保它们都是图像类型。

于 2009-10-07T01:42:00.987 回答
0

我喜欢获取 files 数组,然后使用 foreach 循环遍历可能的条件

$is_error = TRUE;

$allowFileTypes = array(
            "image/png","image/jpg","image/jpeg"
        );

$UserBaseFolder = 'userfiles/'.$_SESSION['user_id'];
            if(!file_exists($UserBaseFolder)) {
            mkdir("userfiles/".$_SESSION['user_id']."/");
        } 



    if ($_FILES['file']['error'] === UPLOAD_ERR_OK) { 
        foreach($_FILES as $dat => $f) {
                if($f['size'] == "0") {
                    $msg .= '<p><span class="alert alert-danger">You must upload a file.</span></p>';
                    $is_error = FALSE;
                }

                if($f['size'] > "2000000") {
                    $msg .= '<p><span class="alert alert-danger">Your file size is too big.</span></p>';
                    $is_error = FALSE;
                }


                if(!in_array($f['type'],$allowFileTypes)){
                    $msg .= '<p><span class="alert alert-danger">Your file has invalid format. Please try again...</span></p>';
                    $is_error = FALSE;
                } else {
                $filepath = $UserBaseFolder.'/'.time().'-'.$f['name'];
                move_uploaded_file($f["tmp_name"], $filepath);
                }

返回$味精;

于 2017-01-03T20:07:20.983 回答