2009-09-30 45 views
1

如何檢查文件擴展名和MIME類型是否在數組中,這是我目前擁有的代碼。從PHP中的數組中檢查上傳文件類型。

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

的問題是,如果文件類型是不是所有的類型的數組(這是不可能的)我得到一個錯誤。它的工作原理是,如果上傳文件位於數組中,則錯誤消息不會觸發。

回答

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

到這樣做的好處是,它可以讓一個.gif文件與jpeg的啞劇。因此它不會強制我的地圖和擴展名匹配,但確保它們都是圖像類型。

+0

PHP不會將擴展映射到'$ _FILES'數組中的MIME類型嗎? – alex 2011-04-19 05:40:38

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

    exit("Unsupported file type"); 
} 
+0

這不是隻能檢查MIME類型是否正確,因此我需要將我的數組更改爲只包含MIME類型。另外,$ _FILES ['upload_project_thum']不必是$ _FILES ['upload_project_thum'] [type]。我還在學習,所以我只是問。謝謝你的幫助! – BandonRandon 2009-09-30 23:26:26

+0

編輯答案。如果你想檢查擴展名,那麼in_array()的第一個參數將是你上傳文件的擴展名,第二個參數是所有允許擴展名的數組。 – rubayeet 2009-10-01 09:38:41

+0

所以你說有兩個數組一個擴展和一個MIME類型?然後使用兩個in_arrays?我可以看到如何工作。謝謝你的幫助。 – BandonRandon 2009-10-01 19:19:16

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; 
} 
+0

謝謝,這似乎工作。我正在使用你的第一個方法。你是第二種方法是別人也建議的,我相信它會起作用,但它只是更多的代碼行。謝謝你的幫助! – BandonRandon 2009-10-01 19:17:50

0

我希望得到的文件數組,然後用在可能的條件下

$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); 
       } 

回報$味精foreach循環literating;

+0

$ allowFileTypes =陣列( \t \t \t \t 「圖像/ PNG」, 「圖像/ JPG」, 「圖像/ JPEG」 \t \t \t); – 2017-01-03 20:08:24