2009-07-17 63 views
7

我的第一個問題,謝謝。 :)

我正在爲我的公司開發支持問題日誌記錄系統,它必須允許上傳文件以及提交到我們數據庫的任何問題。 可能有0-6個不同的上傳來檢查,以及支持問題。通過使用type =「file」輸入選擇圖像或從表單中刪除圖像時,我通過隱藏輸入字段(imgcount)可以獲得準確的變量,以顯示通過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

的& &運營商具有較高的precedence比||,所以而非(A OR B OR C) AND D如你意,它實際上是A OR B OR (C AND D)

您可以使用括號來執行您所期望的評估。

然而,這樣的事情可能是更清潔和更容易維護/閱讀:

$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)) 
     { 

     } 

    } 
} 
2

那麼,你的布爾邏輯是不明確的,可能不會做你想做的事情。這可能會更好地工作:

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

這不是「模棱兩可」,它不是「作者所期望的」。運算符優先級規則解決了該表達式中的任何歧義。 – 2009-07-17 14:21:21

+0

我的歉意;我使用「模棱兩可」的方式含糊不清。 – chaos 2009-07-17 14:41:05

+0

這似乎完美地完成了這項工作。 – 2013-02-23 20:13:05

0

我覺得你if條件是錯誤的。你需要圍繞第一組布爾值的括號中進行邏輯或運算,例如:

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

這意味着正常「如果該文件是(GIF或JPEG或PNG)的圖像,並且小於大小」 。

你以前的方式不可能是你想要的邏輯。

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

對`in_array()`建議+1。 – ceejayoz 2009-07-17 14:26:08

+0

I second Tom Haigh's +1 – Josh 2009-07-17 17:59:35

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 
} 

具有這種分離使得代碼更易讀並且更易於暗示條件層次結構,再加上它允許你的錯誤消息,以更有意義。分離不同類型的條件語句是一種很好的做法,所以任何錯誤消息都是有用的。如果您的代碼出現錯誤,用戶無法知道(不必擔心自己)他們的圖片是否太大或錯誤的類型。

0

您可以將所有['type'] == x || ['type'] == y在一次調用in_array($_FILES[...]['type'], $allowed)>

$ _FILES [..] ['type']包含客戶端發送的數據,既不被php檢查也不被消毒。如果文件的類型與任何相關性都不依賴$ _FILES [..] ['type']或$ _FILES [..] ['name']的後綴。 只有實際的內容很重要。如果需要,你可以使用the fileinfo extensionmime_content_type()(它被標記爲棄用,以文件信息爲準)進行測試

2

我不認爲你真的需要一個通過Javascript更新的變量。您可以使用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 
      } 
     } 
    } 
}