2009-07-17 5 views
7

내 첫 번째 질문, 감사합니다. :)

내 회사의 지원 문제 로깅 시스템을 개발 중이며 데이터베이스에 제출 된 모든 문제뿐만 아니라 파일 업로드도 허용해야합니다. 지원 문제와 함께 확인할 수있는 업로드가 0 ~ 6 개일 수 있습니다. 이미지가 type = "file"입력을 통해 선택되거나 양식에서 제거 될 때마다 js를 통해 업데이트되는 숨겨진 입력 필드 (imgcount)가있는 것을 통해 얼마나 많은 파일이 있는지에 대한 정확한 변수를 얻을 수있었습니다.

내 이름은 image1, image2 등입니다. 내가 생각하기에이 방법을 사용하면 반복 할 수 있습니다.

양식을 제출할 때 다음 코드는 유효한 형식 (gif/jpeg/png) 인 파일이 있는지 확인하여 안전하게 업로드 할 수 있습니다. 지원 시스템이 좋은 보안 로그온을 가지고 있고 우리가 고객을 신뢰하기 때문에 나는 바이러스에 대해 너무 걱정하지 않습니다.

$sscount = $_POST['imgcount']; 
echo $sscount; //to test the variable 
if($sscount>0){ 
    for($i = 1; $i <= $sscount; $i++){ 
     if (($_FILES["image$i"]["type"] == "image/gif") 
     || ($_FILES["image$i"]["type"] == "image/jpeg") 
     || ($_FILES["image$i"]["type"] == "image/png") 
     && ($_FILES["image$i"]["size"] < 500000)) 
     { 

     } 
     else 
     { 
     $errormsg .= "Error: Image $i must be either JPEG, GIF, or PNG and less than 500 kb.<br />"; 
     } 
    } 
} 

그러나 이것은 올바르게 반복되지 않는 것 같습니다. 아무도 아이디어를 얻지 못했고 루프를 통과하여 올바르게 되돌릴 수 있습니까?

답변

8

는 ||보다, 그래서 오히려 (A OR B OR C) AND D보다는 당신이 의도 한대로, 실제로 A OR B OR (C AND D)

입니다 & & 운영자가 precedence 높은를하고있다 괄호를 사용하여 의도 한 평가를 시행 할 수 있습니다.

그러나,이 같은 일이 깨끗하고 유지하기 쉬울 수 있습니다 읽기/: 다른 언급

$allowed_types=array(
    'image/gif', 
    'image/jpeg', 
    'image/png', 
); 


$sscount = $_POST['imgcount']; 
if($sscount>0){ 
    for($i = 1; $i <= $sscount; $i++){ 

     if (in_array($_FILES["image$i"]["type"], $allowed_types) && 
      ($_FILES["image$i"]["size"] < 500000)) 
     { 

     } 

    } 
} 
+0

폴 감사합니다. 많은 감사를드립니다. 결국이 문제를 해결했습니다. – Stann0rz

+0

좋은 코드 Paul. – Josh

2

글쎄, 부울 논리가 모호하고 원치 않는 것 같습니다. 이것은 아마도 더 잘 작동합니다 : 내 druthers이 있다면

if ((($_FILES["image$i"]["type"] == "image/gif") 
    || ($_FILES["image$i"]["type"] == "image/jpeg") 
    || ($_FILES["image$i"]["type"] == "image/png")) 
    && ($_FILES["image$i"]["size"] < 500000)) 

는 비록 전체 건과 같습니다

$file = $_FILES['image' . $i]; 
    $type = $file['type']; 
    if(($type == 'image/gif' || $type == 'image/jpeg' || $type == 'image/png') && $file['size'] < 500000) 
+1

저자가 의도 한 것이 아니기 때문에 "모호하지"않습니다. 연산자 우선 순위 규칙은 해당 식의 모호성을 해결합니다. –

+0

내 사과; "모호한"방식은 모호했습니다. – chaos

+0

이것은 일을 완벽하게 수행하는 것 같습니다. –

0

나는 당신의 잘못 조건부 if 생각합니다. 이 같은 OR 연산하는 논리 값의 첫 번째 그룹의 주위에 괄호가 필요합니다 "파일 (GIF 또는 JPEG 또는 PNG)의 이미지는 그 크기보다 작은 경우"

if ((($_FILES["image$i"]["type"] == "image/gif") 
    || ($_FILES["image$i"]["type"] == "image/jpeg") 
    || ($_FILES["image$i"]["type"] == "image/png")) 
    && ($_FILES["image$i"]["size"] < 500000)) 

이 제대로 의미 .

당신이 이전에했던 방식은 당신이 원하는 논리가 아니었을 것입니다.

5

이것은 귀하의 질문에 대한 직접적인 대답은 아니지만 PHP로 양식 값을 루프로 전달하기 쉬운 배열로 전달할 수 있습니다. in_array()은 값이 허용 목록에 있는지 확인하는데도 유용합니다.

HTML :

<input type="file" name="image[]"> 
<input type="file" name="image[]"> 
<input type="file" name="image[]"> 
<input type="file" name="image[]"> 

PHP :

<?php 
if (isset($_FILES['image'])) { 
    foreach ($_FILES['image'] as $file) { 
     if (!in_array($file['type'], array("image/gif", "image/jpeg", "image/png")) 
      || $file['size'] > 500000) { 
      //error 
     } else { 
      //ok 
     } 
    } 
} 
+1

+1은'in_array()'제안을 위해 +1합니다. – ceejayoz

+0

두 번째 Tom Haigh의 +1 – Josh

4

, 당신이 당신의 조건문을 그룹화 한 방식이 잘못됐다.그러나 단순히 괄호를 추가하는 것보다 두 조건을 완전히 분리하는 것이 좋습니다.

// this declaration + the use of in_array() isn't necessary, 
// it just makes things a bit cleaner. 
$file_types = array("image/gif","image/jpeg","image/png"); 

if($_FILES["image$i"]["size"] < 500000) 
{ 
    if(in_array($_FILES["image$i"]["type"], $file_types))) 
    { 
     // do stuff 
    } 
    else 
    { 
     // error about file type 
    } 
} 
else 
{ 
    // error about file size 
} 

이 구분을하면 코드를 읽기 쉽고 조건 계층을 더 쉽게 제안 할 수 있으며 오류 메시지를보다 의미있게 사용할 수 있습니다. 다른 유형의 조건문을 분리하여 오류 메시지를 유용하게 유지하는 것이 좋습니다. 코드가 그대로 오류를 던지면 사용자는 자신의 이미지가 너무 크거나 잘못된 유형인지 여부를 알 수있는 방법이 없습니다.

+1

+1 다른 오류 메시지. –

0

모든 [ 'type'] == x || in_array($_FILES[...]['type'], $allowed)>in_array($_FILES[...]['type'], $allowed)>

$ _FILES [..] [ 'type']은 클라이언트가 보내거나 php로 검사하거나 위생 처리하지 않은 데이터를 포함합니다. 파일의 유형이 관련성이있는 경우 $ _FILES [..] [ 'type'] 또는 $ _FILES [..] [ 'name']의 접미사에 의존하지 마십시오. 실제 내용 만 중요합니다. 필요한 경우 the fileinfo extension 또는 mime_content_type() (파일 정보 대신 사용되지 않음으로 표시)으로 테스트 할 수 있습니다.

2

자바 스크립트를 통해 업데이트되는 변수가 실제로 필요하지 않다고 생각합니다. PHP를 사용하여 checking the error code에 의해 업로드 된 파일 수를 산출 할 수 있습니다. 다른 브라우저는 종종 다른 MIME 형식을 보낼 수 있으므로 파일 확장명을 확인하여 파일 업로드를 처리 할 수도 있습니다. 다음은 내가 말하고자하는 내용의 예입니다.

$accepted_files = array(
    'jpg', 
    'png', 
    'gif', 
    'jpeg' 
); 

if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
    foreach($_FILES as $key => $upload) { 
     if ($upload['error'] == 0) { 
      $file_parts = explode ('.',$upload['name']); 
      if (in_array($file_parts[sizeof($file_parts)-1], $accepted_files)) { 
       // This type of file is a-ok 
      } 
      else { 
       // Not an accepted file type 
      } 
     } 
    } 
} 
+0

나는이 방법을 좋아한다. 힌트를 주셔서 감사합니다. 나는이 일을 다른 프로젝트에서 확실히 사용할 것이다. – Stann0rz

+0

+1 불필요한 자바 스크립트를 사용하지 않기 때문에 덜 복잡한 해결책이 더 좋습니다. – Josh

관련 문제