2013-02-18 106 views
0

我想構建一個簡單的圖像上傳,但當我試圖上傳任何圖像時,我收到一個錯誤,告訴我它的一個無效文件。誰能告訴我我做錯了什麼?圖像上傳錯誤

這裏是我的代碼:

<?php 

    $allowExts = array("jpg", "jpeg", "gif", "png", "stl"); 
    $extensions = end(explode(".", $_FILES["file"]["name"])); 

    if ((($_FILES["file"]["type"] == "image/gif") 
    || ($_FILES["file"]["type"] == "image/jpeg") 
    || ($_FILES["file"]["type"] == "image/png") 
    || ($_FILES["file"]["type"] == "image/pjpeg") 
    || ($_FILES["file"]["type"] == "image/stl")) 
    && ($_FILES["file"]["size"] < 21000) 
    && in_array($extension, $allowExts)) 

    { 
     if ($_FILES ["file"]["error"] > 0){ 
     echo "ERROR: " . $_FILES["file"]["error"] . "<br>"; 
     } 

     else{ 
      echo "Upload: " . $_FILES["file"]["name"]; 
      echo "Type: " . $_FILES["file"]["type"]; 
      echo "Size: " . ($_FILES["file"]["size"]/1024) . " kB<br>"; 
      echo "Stores in: " . $_FILES["file"]["tmp_name"]; 

      if (file_exists("upload/" . $_FILES["file"]["name"])){ 
       echo $FILES["file"]["name"] . "already exists. "; 
      } 
      else{ 
       move_uploaded_file($_FILES["file"]["tmp_name"], 
       "upload/" . $FILES["file"]["name"]); 
       echo "Stored in: " . "upload/" . $FILES["file"]["name"]; 
      } 
     } 
    } 
    else{ 
     echo "Invalid File"; 
     } 

?> 

這是我根據我所做的編輯調整的文件:

<?php 

$allowExts = array("jpg", "jpeg", "gif", "png", "stl"); 
$extension = end(explode(".", $_FILES["file"]["name"])); 

if ((($_FILES["file"]["type"] == "image/gif") 
|| ($_FILES["file"]["type"] == "image/jpeg") 
|| ($_FILES["file"]["type"] == "image/png") 
|| ($_FILES["file"]["type"] == "image/pjpeg") 
|| ($_FILES["file"]["type"] == "image/stl")) 
&& ($_FILES["file"]["size"] < 30000000) 
&& in_array($extension, $allowExts)) 

{ 
    if ($_FILES ["file"]["error"] > 0){ 
    echo "ERROR: " . $_FILES["file"]["error"] . "<br>"; 
    } 

    else{ 
     echo "Upload: " . $_FILES["file"]["name"] . "<br>"; 
     echo "Type: " . $_FILES["file"]["type"] . "<br>"; 
     echo "Size: " . ($_FILES["file"]["size"]/1024) . " kB<br>"; 
     echo "Stores in: " . $_FILES["file"]["tmp_name"] . "<br>"; 

     if (file_exists("images/" . $_FILES["file"]["name"])){ 
      echo $FILES["file"]["name"] . "already exists. "; 
     } 
     else{ 
      move_uploaded_file($_FILES["file"]["tmp_name"], 
      "images/" . $FILES["file"]["name"]); 
      echo "Stored in: " . "images/" . $FILES["file"]["name"]; 
     } 
    } 
} 
else{ 
    echo "Invalid File"; 
    print_r($_FILES); 
    } 

?> 
+2

嘗試:'echo $ _FILES [「file」] [「type」];'看看它是什麼類型的文件,以及它是否在你的列表中。 – 2013-02-18 16:37:08

+2

向我們展示'print_r($ _ FILES)'的結果。 – MrCode 2013-02-18 16:37:36

+0

我知道我嘗試上傳的文件是PNG和JPG,似乎都沒有工作,但我有他們在列表中。使用谷歌瀏覽器,而不是IE或Firefox,其他jpg擴展也需要。 – Giovatto 2013-02-18 16:38:50

回答

1

讓我們稍微簡化一下; HTML應該是這個樣子:

<form method='POST' action="upload.php" enctype="multipart/form-data" > 

<input type="file" name="userfile" id="userfile" /> 

<input type="submit" value="upload" /> 

</form> 

你的PHP,試試這個來代替:

<?php 
//GRAB IMAGE FROM POST 
$pic = $_FILES['userfile']; 
$picName = $_FILES['userfile']['name']; 

$file_ext = strtolower(end(explode(".", $picName))); 



if($file_ext == "jpg" || $file_ext == "jpeg" || $file_ext == "gif" || $file_ext == "png"){ 

    //MAKE SURE YOU HAVE CHMOD 777 THIS DIRECTORY AND DOUBLE CHECK THIS IS THE CORRRECT DIRECTORY! 
    $theDirectory = 'upload/theImage.'.$file_ext; 

    //MOVE THE FILE TO THIS DIRECTORY 
    move_uploaded_file($pic['tmp_name'], $theDirectory); 


} 
else{ 


     echo 'bad file'; 
} 

?> 

這是一個有點工作的周圍,以驗證該文件,但它的伎倆。確保你命名的PHP文件upload.php或任何你想要的,只要確保你改變了HTML上的form以匹配。確保你將文件夾"upload"修改爲777.這樣做應該無限期地工作。我總是發現最好的方式是讓它工作,然後回去繼續安全工作。舉例來說,你應該使用GD庫,以驗證它是通過做這樣一個合法的圖像(該位可能需要調整):

//MAKE IT A JPEG 

$theDirectoryTwo = 'upload/theImageValidated.jpg'; 
$theRawImage = file_get_contents($theDirectory); 
$theRawImage = imagecreatefromstring($theRawImage); 
imagejpeg($theRawImage, $theDirectoryTwo); 

運行要麼導致一個完美的JPEG每次除非有人在試圖命名一個文本文件來表示喜歡「anImage.jpg」,上面的一點會導致一個黑色的圖像。只需要聲明GD庫已安裝。

對於corse來說,總會有可怕的Chmod 777安全風險,只要上傳的文件在那裏,你應該沒問題,沒有任何問題。

+1

這工作完美! – Giovatto 2013-02-18 20:00:02

2

沒有與「擴展」和「擴展」一個錯字。如果修復,請用is_uploaded_file檢查您的文件。

in_array($extension, $allowExts)必須是in_array($extensions, $allowExts)或名稱$extensions$extension

您必須使用元素1像$extension[1]

+0

我剛剛嘗試進行更改,仍然無效。圖像將上傳到100%,然後給我錯誤 – Giovatto 2013-02-18 16:50:32

+0

對不起,我的壞,等待,你必須使用$擴展[1]爲分機擴展。不好意思,對不起,沒有看到'end()' – Patrick 2013-02-18 16:51:03

+0

對不起,我對你的評論有點遺憾,請使用$ extension [1]或者不要? – Giovatto 2013-02-18 16:57:15

0

從意見,我可以看到你已經上傳的是上面的大小限制的文件。實際文件大小在不同操作系統中可能會有所不同,因此請務必使用足夠大的限制。

這可能是值得創建一個文件驗證函數,它會執行每個單獨的檢查(類型,大小,擴展名),並讓它返回更細微的有意義的錯誤,如無效擴展,無效類型等。這將使它更容易在未來進行調試。

+0

我有提出的大小限制,但它仍然給我相同的警告,我剛剛更新了第二部分。 – Giovatto 2013-02-18 18:05:20

+0

與'uploader.php'具有相同等級的圖像嗎? – MrCode 2013-02-18 18:36:45