2009-09-30 4 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; 
     } 

문제는이 파일 형식은있는 유형의 ALL이 아닌 경우 배열 (불가능합니다) 오류가 발생합니다. 오류 메시지가 트리거되지 않는 업로드 파일이 배열에있는 경우 작동합니다.

답변

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의 mime로. 따라서 광산과 확장판을 강제로 일치 시키지는 않지만 두 이미지 유형인지 확인합니다.

+0

PHP는 확장을'$ _FILES' 배열의 mime 타입으로 매핑하지 않습니까? – alex

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

+0

답변을 편집했습니다. 확장 기능을 확인하려면 in_array()의 첫 번째 매개 변수는 업로드 한 파일의 확장자이고 두 번째 매개 변수는 허용되는 모든 확장자의 배열입니다. – rubayeet

+0

그래서 확장을위한 배열 하나와 MIME 유형을위한 배열이 두 개 있다고 말하고 있습니까? 그런 다음 두 개의 in_arrays를 사용 하시겠습니까? 그게 어떻게 작동하는지 알 수 있어요. 당신의 도움을 주셔서 감사합니다. – BandonRandon

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

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

반환 $의 MSG를 통해 foreach 루프의 literating를 사용하려면;

+0

= $ allowFileTypes 어레이 ( \t \t \t \t "이미지/PNG", "이미지/JPG", "이미지/JPEG" \t \t \t); –