2012-11-20 95 views
2

我一直在嘗試php的上傳功能,我一直在關注w3school上的這個教程。Php上傳圖像到目錄

http://www.w3schools.com/php/php_file_upload.asp 

I installed this script on MYDOMAIN.com/New.html 


<html> 
<body> 

<form action="upload_file.php" method="post" 
enctype="multipart/form-data"> 
<label for="file">Filename:</label> 
<input type="file" name="file" id="file"><br> 
<input type="submit" name="submit" value="Submit"> 
</form> 

</body> 
</html> 

然後我把這個片斷MYDOMAIN.com/upload_file.php

<?php 
$allowedExts = array("jpg", "jpeg", "gif", "png"); 
$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"]["size"] < 20000) 
&& in_array($extension, $allowedExts)) 
    { 
    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 "Stored in: " . $_FILES["file"]["tmp_name"]; 
    } 
    } 
else 
    { 
    echo "Invalid file"; 
    } 
?> 

現在有,即時通訊只是一個非常困惑的人,但我認爲是假設什麼是非常高的機會做的是把我放入New.html文件的文件,如果它是一個圖像文件上傳到我的目錄,而不是它只是輸出無效文件我不知道該怎麼做任何幫助是很大的希望聽到回來很快謝謝

+0

我假設你沒有被上傳上傳的圖片文件或文件大小大於20000個字節 – asprin

+1

,請千萬不要使用w3schools:http:// w3fools .com/ –

+1

顯示'print_r($ _ FILES)的結果;' – MrCode

回答

5

你的腳本的問題是,y ou可能試圖上傳超出您的限制的文件!你指定了一個非常低的最大文件大小!打印出你的$ _FILES變種,以獲取有關什麼是錯的信息)

然而,爲了將文件移動到您的文件夾,你仍然需要使用move_uploaded_file

$allow = array("jpg", "jpeg", "gif", "png"); 

$todir = 'uploads/'; 

if (!!$_FILES['file']['tmp_name']) // is the file uploaded yet? 
{ 
    $info = explode('.', strtolower($_FILES['file']['name'])); // whats the extension of the file 

    if (in_array(end($info), $allow)) // is this file allowed 
    { 
     if (move_uploaded_file($_FILES['file']['tmp_name'], $todir . basename($_FILES['file']['name']))) 
     { 
      // the file has been moved correctly 
     } 
    } 
    else 
    { 
     // error this file ext is not allowed 
    } 
} 
+0

當您爲擴展名分解文件時,您忘記了結果返回的數組中的第一個索引是「文件名」,第二個索引是「文件擴展名」,所以不是「if (in_array($ ext。$ allow))「我將它改爲」if(in_array($ ext [1]。$ allow)) –

+0

感謝@BlankEDjok指出了這一點,儘管你還不完全正確!不要連接'in_array'內的參數;這是毫無意義的!使用文件名的最後一段是正確的,但我修正了這個;) – Ivo

+0

LOL對不起,我沒有看到它,這只是一個錯字:) –

2

上傳圖片的最佳方式我認爲會複製圖片和st放在一個文件夾內,然後將圖像的新位置存儲到數據庫中。

移動的文件,我們可以使用move_uploaded_file功能

$oldpath = $_FILES['image']['tmp_name']; 
$newpath ="new_folder_location/".$_FILES['image']['name']; 
move_uploaded_file($oldpath, $newpath); 
+0

什麼是var_dump($ _ FILES)打印? – GaurabDahal

0

這是因爲下面的表達式的值爲false:

(($_FILES["file"]["type"] == "image/gif") 
|| ($_FILES["file"]["type"] == "image/jpeg") 
|| ($_FILES["file"]["type"] == "image/png") 
|| ($_FILES["file"]["type"] == "image/pjpeg")) 
&& ($_FILES["file"]["size"] < 20000) 
&& in_array($extension, $allowedExts) 

這意味着

  • 文件類型或者是不正確的(它不是GIF/JPEG/PNG/PNJPEG文件)
  • 該文件是大於20000個字節
  • 文件的擴展名是不正確的(它不是任何「JPG」,「JPEG」,「GIF」,「PNG」)的

我的猜測將是文件大小 - 大幅增加。它更改爲以下允許尺寸高達10 MB:

&& ($_FILES["file"]["size"] < 10485760) 

看問題的最好辦法就是這一行添加到腳本的開頭:

var_dump($_FILES); 
+0

我很確定OP不會知道上面的代碼中發生了什麼。解釋會更合適 – asprin

+0

謝謝,我會添加一個解釋。 –

+0

哈哈謝謝你asprin,這將是可怕的我迷路了,謝謝你們一噸。 –

1

您的驗證碼是檢查擴展名,MIME類型和文件大小。

您可能正在上傳擴展名中帶有大寫字母的文件。當您檢查擴展,則檢查是否區分大小寫,.JPG是一個有效的圖像文件的擴展,所以你應該讓你的檢查不區分大小寫:

if ((($_FILES["file"]["type"] == "image/gif") 
|| ($_FILES["file"]["type"] == "image/jpeg") 
|| ($_FILES["file"]["type"] == "image/png") 
|| ($_FILES["file"]["type"] == "image/pjpeg")) 
&& ($_FILES["file"]["size"] < 20000) 
&& in_array(strtolower($extension), $allowedExts)) 
     //^added strtolower() 

如果不是眼前的問題,則該文件太大或者有錯誤的MIME類型。要進行調試,查看與文件數組:

print_r($_FILES); 
+2

+1 strtolower()'。這只是表明w3schools上的教程有多糟糕。 –

+0

不能同意更多我根本無法理解這個東西,他們沒有幫助1位。 –

1

我想說的問題是,如果,有很多的條件有(也稱「無效文件」是的,如果else部分),試圖簡化它跟蹤問題,乍一看我會說這是因爲大小檢查的:

&& ($_FILES["file"]["size"] < 20000) 

這是圍繞20Kb大小的,很小的圖像,如果您要上傳的照片,嘗試提出了更高的價值或採取出這種情況,看看腳本是否有效

+0

嗯乍一看這似乎解決了它,但它給了我一個tmp文件主頁/內容/ 34/9587634/tmp/phpSrWuFu 女巫真棒,但我看在我的目錄,沒有什麼? –

+0

你需要最後一步,當你上傳一個文件時,它總是先保存在一個tmp目錄中,然後你就可以使用這個文件函數將其移動到您想要的實際目錄。這是標準程序。也許這是教程的最後一步,你錯過了,或谷歌另一個看到指定的最後一步,有很多。 – aleation

0

我伊沃的答案達成一致,但我認爲,你可以做下一個 一段代碼這樣的變化:

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

// Allow certain file formats 

if($typePicture[0] != "jpg" || $typePicture[1] != "png" || $typePicture[2] != "jpeg" || $typePicture[3] != "gif") 
{ 
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; 
    $uploadOk = 0; 
}