php實現檔案上傳詳解

來源:互聯網
上載者:User
你真的掌握php檔案上傳技術了嗎?這篇文章就為大家整理了php檔案上傳的相關資料,具有一定的參考價值,感興趣的小夥伴們可以參考一下

這裡首先聲明一下這一章的內容比較多,比較難,你要抱著和自己死磕的態度。細微之處不放過,多敲多練是王道。
學習就像爬山,得一步一步來,首先給自己定一個小目標,然後再堅持不懈地往高出攀爬,最終到達最頂峰。
請仔細斟酌上面兩句忠告

一、我的準備情況說明。

編輯器:sublime text3(用什麼編輯器看自己愛好)
伺服器構建:使用phpstudy2014構建伺服器,伺服器檔案儲存體在我自身電腦D盤的www檔案中。(安裝phpstudy會自動產生www檔案,安裝在哪個盤自己做主)。運行phpstudy,通過在瀏覽器地址欄輸入localhost可以訪問伺服器中檔案。
上傳檔案的過程:瀏覽器在用戶端上傳檔案,點擊提交,檔案被傳送給伺服器中的某個php檔案進行處理,該php對該上傳檔案儲存到伺服器。

二、建立表單

請看我的html代碼

enctype

在Form元素的文法中,EncType表明提交資料的格式 用 Enctype 屬性指定將資料回傳到伺服器時瀏覽器使用的編碼類別型。enctype有三種:
1、application/x-www-form-urlencoded: 表單資料被編碼為成對的名稱和數值。這是標準的編碼格式。
2、multipart/form-data: 表單資料被編碼為一條訊息,頁上的每個控制項對應訊息中的一個部分。
3、 text/plain: 表單資料以純文字形式進行編碼,其中不含任何控制項或格式字元。
補充(隨便看看就好):orm的enctype屬性為編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,預設為application/x-www-form-urlencoded。 當action為get時候,瀏覽器用x-www-form-urlencoded的編碼方式把form資料轉換成一個字串(name1=value1&name2=value2…),然後把這個字串append到url後面,用?分割,載入這個新的url。 當action為post時候,瀏覽器把form資料封裝到http body中,然後發送到server。 如果沒有type=file的控制項,用預設的application/x-www-form-urlencoded就可以了。 但是如果有type=file的話,就要用到multipart/form-data了。瀏覽器會把整個表單以控制項為單位分割,並為每個部分加上Content-Disposition(form-data或者file),Content-Type(預設為text/plain),name(控制項name)等資訊,並加上分割符(boundary)。

有點難理解。
總歸就記住兩句話:如果input標籤中有type=file,則enctype=multipart/form-data。如果沒有type=file一般情況下使用application/x-www-form-urlencoded。
檔案上傳時都要將資料進行一定轉化才能上傳到伺服器,application/x-www-form-urlencoded和multipart/form-data兩者之間的區別就在與轉化編碼方式不同。

三、建立php檔案用於處理上傳的檔案。

上傳檔案後效果如下:

每一個上傳檔案都有name、type、size、tmp_name等資訊。檔案上傳後,這些檔案相關資訊存在FILES這個陣列變數。_FILES[“myfile”][“name”]相當於一個多維陣列的訪問,FILES先擷取表單名稱為myfile的input上傳的檔案資料,然後再訪問name、type、size、error等資料。_FILES["myfile"]["error"]用來處理檔案沒有正常上傳的情況,例如超過限定上傳的檔案大小。如果FILES[“myfile”][“error”]=0,表示檔案正常上傳。_FILES[“myfile”][“error”]>0表示檔案沒有正常上傳。
FILES[“myfile”][“error”]=1上傳檔案超過伺服器限定的值,比如超過伺服器空間大小。_FILES[“myfile”][“error”]=2 超過瀏覽器限定上傳的值 $_FILES[“myfile”][“error”]=3檔案只有部分被上傳

FILES[“myfile”][“error”]=4沒有檔案本上傳。_FILES[“myfile”][“error”]還可以為5、6、7、8,這裡不做深究,只需知道其大於0時就意味這檔案上傳出錯即可。

上傳限制

通常情況下,伺服器通常會限制伺服器上傳檔案的大小或者類型。我們在上面php代碼的基礎上添加對上傳檔案代碼的限制。
先熟悉幾個函數用法:
explode()函數用於分割字串,例:explode(“.”,”aaa.HTML”)就是在點的位置將這個字串分成”aaa”和”HTML”兩個字串,這兩個字串按順序儲存在同一個數組中。
end()擷取數組中最後一個元素的值。
in_array()在數組中尋找某個元素,看是否存在,存在返回為true,不存在返回為false。

<?php//第一步:明確伺服器規定上傳至伺服器的檔案類型。這裡我們只允許上傳以下類型的圖片。$allowedExts = array("gif", "jpeg", "jpg", "png");// 允許上傳的圖片尾碼//第二部:擷取上傳的檔案名稱,通過explorde()函數將其分割成字串形式的數組。$temp = explode(".", $_FILES["myfile"]["name"]);echo $_FILES["file"]["size"];$extension = end($temp);   // end函數用於擷取數組中最後一個元素的值。//第三步:列出上傳檔案需要滿足的條件if ((($_FILES["myfile"]["type"] == "image/gif")|| ($_FILES["myfile"]["type"] == "image/jpeg")|| ($_FILES[myfile"]["type"] == "image/jpg")|| ($_FILES["myfile"]["type"] == "image/pjpeg")|| ($_FILES["myfile"]["type"] == "image/x-png")|| ($_FILES["myfile"]["type"] == "image/png"))&& ($_FILES["myfile"]["size"] < 204800)  // 小於 200 kb&& in_array($extension, $allowedExts))  //in_array表示在$allowedExts數組中尋找$extension這個字串{  if ($_FILES["myfile"]["error"] > 0)  {    echo "錯誤:: " . $_FILES["myfile"]["error"] . "<br>";    //舉個例子伺服器空間不足,檔案只能上傳部分就會出現錯誤。  }  else  {    echo "上傳檔案名稱: " . $_FILES["myfile"]["name"] . "<br>";    echo "檔案類型: " . $_FILES["myfile"]["type"] . "<br>";    echo "檔案大小: " . ($_FILES["myfile"]["size"] / 1024) . " kB<br>";    echo "檔案臨時儲存的位置: " . $_FILES["myfile"]["tmp_name"] . "<br>";  }}else{  echo "非法的檔案格式";}?>

四、儲存上傳的檔案

檔案上傳後,它是儲存在一個臨時的位置。指令碼結束時它就會消失。如果要把他永久的儲存在伺服器中,我們要把它儲存在另一個位置。
. file_exists(“upload/” . FILES[“file”][“name”])檢查檔案或目錄是否存在。.moveuploadedfile(_FILES["file"]["tmp_name"], "upload/" . $_FILES[“myfile”][“name”]);將上傳檔案從臨時位置轉移到伺服器空間。

<?php//第一步:明確伺服器規定上傳至伺服器的檔案類型。這裡我們只允許上傳以下類型的圖片。$allowedExts = array("gif", "jpeg", "jpg", "png");// 允許上傳的圖片尾碼//第二部:擷取上傳的檔案名稱,通過explorde()函數將其分割成字串形式的數組。$temp = explode(".", $_FILES["myfile"]["name"]);echo $_FILES["myfilefile"]["size"];$extension = end($temp);   // end函數用於擷取數組中最後一個元素的值。//第三步:列出上傳檔案需要滿足的if ((($_FILES["myfile"]["type"] == "image/gif")|| ($_FILES["myfile"]["type"] == "image/jpeg")|| ($_FILES["myfile"]["type"] == "image/jpg")|| ($_FILES["myfile"]["type"] == "image/pjpeg")|| ($_FILES["myfile"]["type"] == "image/x-png")|| ($_FILES["myfile"]["type"] == "image/png"))&& ($_FILES["myfile"]["size"] < 204800)  // 小於 200 kb&& in_array($extension, $allowedExts))//in_array表示在$allowedExts數組中尋找$extension這個字串{  if ($_FILES["myfilefile"]["error"] > 0)  {    echo "錯誤:: " . $_FILES["myfile"]["error"] . "<br>";  }  else  {    echo "上傳檔案名稱: " . $_FILES["myfile"]["name"] . "<br>";    echo "檔案類型: " . $_FILES["myfile"]["type"] . "<br>";    echo "檔案大小: " . ($_FILES["myfile"]["size"] / 1024) . " kB<br>";    echo "檔案臨時儲存的位置: " . $_FILES["myfile"]["tmp_name"] . "<br>";    // 判斷當期目錄(即www檔案夾中)下的 upload 目錄(自己建立,名字自取)是否存在該檔案    // 如果沒有 upload 目錄,你需要建立它,upload 目錄許可權為 777    if (file_exists("upload/" . $_FILES["myfile"]["name"]))    {      echo $_FILES["myfile"]["name"] . " 檔案已經存在。 ";    }    else    {      // 如果 upload 目錄不存在該檔案則將檔案上傳到 upload 目錄下      move_uploaded_file($_FILES["myfile"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);//      echo "檔案儲存體在: " . "upload/" . $_FILES["myfile"]["name"];    }  }}else{  echo "非法的檔案格式";}?>

以上就是本文的全部內容,希望對大家的學習有所協助。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.