首頁 >後端開發 >php教程 >php實作檔案上傳詳解

php實作檔案上傳詳解

墨辰丷
墨辰丷原創
2018-05-30 11:29:366458瀏覽

你真的掌握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 "非法的文件格式";
}
?>

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


相關推薦:

PHP將身分證正反面兩張照片合成一張圖片的方法

#PHP使用SWOOLE擴充實作定時同步MySQL 資料的方法

PHP關於物件知識總結

################################################################ ################

以上是php實作檔案上傳詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn