PHP檔案上傳詳解_PHP教程

來源:互聯網
上載者:User
檔案上傳分為兩個部分,HTML顯示部分和PHP處理部分,HTML部分主要是用來讓使用者來選擇所要上傳的檔案,然後通過PHP中的$_FILES在後台接收,然後把檔案上傳到指定目錄中。

HTML部分:

代碼如下 複製代碼


說明:

form標答的action="upload.php"是指點擊這個form中的submit的時候,這個上傳命令會被發送到這個叫 upload.php的頁面去處理。method="post"是指以post方式去送,enctype="multipart/form-data"屬性規定了在提交這個表單時要使用哪種內容類型,在表單需要位元據時,比如檔案內容,請使用"multipart/form-data",如果要上傳檔案,這個屬性是必要的。input中的type="file"時,規定了應該把輸入作為檔案來處理,並且在input後面會有一個瀏覽的按鈕。

PHP部分:

代碼如下 複製代碼


if($_FILES['myfile']['name'] != '') {

if($_FILES['myfile']['error'] > 0) {

echo "錯誤狀態:" . $_FILES['myfile']['error'];

} else {

move_uploaded_file($_FILES['myfile']['tmp_name'] , "uploads/" .

$FILES['myfile']['name']);

echo "";

}

} else{

echo "";

}

?>


說明:

在解釋這篇代碼前,我們有必要瞭解以下知識。

$_FILES['myfile']['name'] 是指被上傳檔案的名稱

$_FILES['myfile']['type'] 是指被上傳檔案的類型

$_FILES['myfile']['size'] 是指被上傳檔案的大小,單位為位元組(B)

$_FILES['myfile']['tmp_name'] 是指被上傳檔案存在伺服器中的臨時副本檔案名稱,檔案被移動到指定目錄後臨檔案將被自動消毀。

$_FILES['myfile']["error"] 是指由檔案上傳中有可能出現的錯誤的狀態代碼,關於各狀態含義後在會說明。

首先,$_FILES['myfile']['name']中的myfile是指在上面HTML頁面中上傳檔案標籤的name值,根據這個我們才能知道我們正在處理的檔案是哪一個input提交過來的,然後再來判斷一下 $_FILES['myfile']['name'] 不是否為空白,根據這個我們可以知道使用者有沒有上傳檔案,從而執行不同的操作。如果上傳了檔案並且狀態是0就說明上傳成功,我們就可以用 move_uploaded_file方法把上傳的檔案存放到指定目錄,上面這個例子是指把上傳的檔案移動到同目錄下的uploads檔案夾下,這個路徑是相對於這個PHP檔案(既upload.php)的相對目錄。比如,我們想把上傳的檔案移動到upload.php上一層叫user的檔案夾中的話,我們就可以這樣寫:move_uploaded_file($_FILES['myfile']['tmp_name'] , "../user/" . $FILES['myfile']['name']),這種方法使用起來很方便、靈活,這樣一個檔案就被上傳到伺服器中了,可以開啟伺服器中的目錄查看該檔案。 允許使用者上傳檔案是一個有巨大的安全風險的行為,因此,通常情況下,我們會對使用者上傳的檔案做一些限制,如下:

代碼如下 複製代碼

if($_FILES['myfile']['name'] != '') {

if($_FILES['myfile']['error'] > 0) {

echo "錯誤狀態:" . $_FILES['myfile']['error'];

} else {

if($_FILES['myfile']['type'] == 'image/jpeg' or $_FILES['myfile']['type'] ==

'image/pjpeg' or $_FILES['myfile']['type'] == 'image/gif' &&

$_FILES['myfile']['size'] < 20480){

move_uploaded_file($_FILES['myfile']['tmp_name'] , "uploads/" .

$FILES['myfile']['name']);

echo "";

} else {

echo "";

}

?>

從上面的代碼可以看出,我們規定了上傳的檔案類型必須是jpeg或者Gif並且必須小於2MB的檔案($_FILES['myfile']['size']的預設單位是位元組)。這裡必須提到的是,對於IE瀏覽器,它識別jpg檔案的類型必須是 pjpeg,而對於 FireFox,則必須是 jpeg,因此,我們必須對jpeg和pjpeg都作判斷。這樣一來,我們可以限制使用者上傳的一些危險的比如木馬或者病毒指令碼,來保證了伺服器的安全運行。現在,一個上傳檔案程式就基本成形了。但時在有些時候,考慮到使用者體驗,我們還可以對使用者上傳過程中發生的錯誤作出一些提醒,讓使用者明白是哪裡出了問題,我們會對$_FILES['myfile']['error']作出一些說明,先來看一下在PHP中對$_FILES['myfile']['error']常見6種狀態的定義。

代碼如下 複製代碼

$_FILES['teacher_pic']['error'] = 1 檔案大小超過了PHP.ini中的檔案限制

$_FILES['teacher_pic']['error'] = 2 檔案大小超過了瀏覽器限制

$_FILES['teacher_pic']['error'] = 3 檔案部分被上傳

$_FILES['teacher_pic']['error'] = 4 沒有找到要上傳的檔案

$_FILES['teacher_pic']['error'] = 5 伺服器臨時檔案夾丟失

$_FILES['teacher_pic']['error'] = 6 檔案寫入到臨時檔案夾出錯

錯誤資訊狀態為1時說明上傳的檔案超過了php.ini中的檔案大小限制,此限制可以再php.ini中設定(Maximum allowed size for uploaded files.upload_max_filesize = 2M),這裡是在第516行,這一句說定義了PHP中上傳檔案的最大位元組數,預設情況下是2MB,這個設定是PHP全域上傳限制,許可權最高,即使$_FILES['myfile']['size']設為10MB,也只能上傳2MB以下的檔案。比如,在預設情況下,如果規定$_FILES['myfile']['size'] < 10MB,在使用者上傳檔案大於2MB的情況下,就會現在$_FILES['teacher_pic']['error'] = 1的情況,一般來說,我們須要把$_FILES['myfile']['size']的值設定在upload_max_filesize值之下(設大了也沒用,呵呵)。當然,你完全可以把php.ini中的upload_max_filesize值調的更大,但實際應用中,我們考慮到伺服器的負載能力,不建議upload_max_filesize的值超過20MB,這樣會造成網站附件增大,這在論壇社區上可以很明顯的看出來。瞭解了這些,我們就可以對錯誤狀態作出定義,我們再來完善一下代碼:

代碼如下 複製代碼

if($_FILES['myfile']['name'] != ''){

if($_FILES['myfile']['error'] > 0){

switch($_FILES['myfile']['error']){

case 1:

echo "檔案大小超過了PHP.ini中的檔案限制!";

break;

case 2:

echo "檔案大小超過了瀏覽器限制!";

break;

case 3:

echo "檔案部分被上傳!";

break;

case 4:

echo "沒有找到要上傳的檔案!";

break;

case 5:

echo "伺服器臨時檔案夾丟失,請重新上傳!";

break;

case 6:

echo "檔案寫入到臨時檔案夾出錯!";

break;

}

} else {

if($_FILES['myfile']['type'] == 'image/jpeg' or $_FILES['myfile']['type'] ==

'image/pjpeg' or $_FILES['myfile']['type'] == 'image/gif' &&

$_FILES['myfile']['size'] < 20480) {

move_uploaded_file($_FILES['myfile']['tmp_name'] , "uploads/" .

$FILES['myfile']['name']);

echo "";

} else {

echo "";

}

?>


我們可以使用switch語句來對6種錯狀態作出定義,這樣來下,在發生錯誤的時間,使用者就會明白,是哪裡出了問題。但是還有一種情況就是,使用者上傳的檔案在指定的目錄中已經存在,這裡我們可以使用file_exists方法來判斷一下:

代碼如下 複製代碼


if($_FILES['myfile']['name'] != ''){

if($_FILES['myfile']['error'] > 0){

switch($_FILES['myfile']['error']){

case 1:

echo "檔案大小超過了PHP.ini中的檔案限制!";

break;

case 2:

echo "檔案大小超過了瀏覽器限制!";

break;

case 3:

echo "檔案部分被上傳!";

break;

case 4:

echo "沒有找到要上傳的檔案!";

break;

case 5:

echo "伺服器臨時檔案夾丟失,請重新上傳!";

break;

case 6:

echo "檔案寫入到臨時檔案夾出錯!";

break;

}

} else {

if($_FILES['myfile']['type'] == 'image/jpeg' or $_FILES['myfile']['type'] ==

'image/pjpeg' or $_FILES['myfile']['type'] == 'image/gif' &&

$_FILES['myfile']['size'] < 20480) {

if (!file_exists("uploads/" . $_FILES["myfile"]["name"])) {

move_uploaded_file($_FILES['myfile']['tmp_name'] , "uploads/" .

$FILES['myfile']['name']);

echo "";

} else{

echo "";

}

} else {

echo "";

}

?>

只是上傳檔案最原始的方法,這樣更容易自己理解,使用時大家可以考慮把它寫成類,現在我們再來總結一下上傳中的邏輯判斷順吧。

1. 先判斷是否上傳檔案

2. 如果有再來判斷上傳中是否出錯

3. 如果出錯,則提示出錯資訊

4. 如查沒出錯,再判斷檔案類型

5. 如果類型符合條件,再判斷指定目錄中有沒有存在該檔案

6. 如果沒有就把該檔案移至指定目錄

http://www.bkjia.com/PHPjc/628736.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/628736.htmlTechArticle檔案上傳分為兩個部分,HTML顯示部分和PHP處理部分,HTML部分主要是用來讓使用者來選擇所要上傳的檔案,然後通過PHP中的$_FILES在後台接收,...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.