1. 程式人生 > >PHP檔案上傳

PHP檔案上傳

原理:

檔案從使用者本地電腦通過傳輸方式(web表單)儲存到伺服器所在電腦指定的目錄下。

1、增加檔案上傳的表單:瀏覽器請求一個伺服器的HTML指令碼(包含檔案上傳表單)

2、使用者從本地選擇一個檔案(點選上傳框(按鈕) )

3、使用者點選上傳:檔案會通過網際網路傳輸到伺服器上

4、伺服器作業系統會將檔案儲存到臨時目錄:以臨時檔案格式儲存(windows下tmp)

5、伺服器指令碼開始工作:判斷檔案有效

6、伺服器指令碼將有效檔案從臨時目錄移動到指定目錄下(完成)

表單寫法

method屬性:表單提交方式必須為POST

enctype屬性:form表單屬性:主要是規範表單資料的編碼方式

 上傳表單:file表單

$_FILES變數詳解(該變數必須大寫)

在PHP中,有一個預定義變數$_files是專門用來儲存使用者上傳的檔案

name:檔案在使用者(瀏覽器端)電腦上實際存在的名字(實際用來保留後綴)

tmp_name:檔案上傳到伺服器後作業系統儲存的臨時路徑(實際用來給PHP後期使用)

type:MIME(多功能網際網路郵件擴充套件)型別,用來在計算機中客戶端識別檔案型別(確定軟體)

error:檔案上傳的代號,用來告知應用軟體(PHP)在檔案接收過程中出現了什麼問題(PHP後期根據程式碼進行檔案判斷)

size:檔案大小(PHP根據實際需求確定是否該保留)

移動臨時檔案到目標位置

檔案上傳之後會儲存到$_files中,那麼訪問檔案資訊的形式就是$_files['表單 name屬性值']['元素資訊']...

1、判斷是否為上傳的檔案:is_uploaded_file()

2、移動檔案:move_upload_file()

多檔案上傳

場景:

當商品需要上傳多個圖片進行展示的時候:那麼需要使用多檔案上傳

         針對一個內容,但是不同檔案:同名表單

當商品需要進行多個維度圖片說明的時候:需要使用多檔案上傳

         針對不同內容,所以表單名字不同:批量解決問題

多檔案上傳的$_FILES變數的資料結構形式

批量上傳:同名表單

將表單名字形成一個數組,而且同時將檔案對應的五個要素:name、tmpname、size、type、error都形成對應數量的陣列

批量上傳:不同名錶單

每個檔案都會形成一個屬於自己獨立的5個元素的陣列

對於拿到的兩種結果的處理:對多檔案資訊的遍歷讀取和處理

1、不同名多檔案上傳:

按照表單名字從$_FILES中取出來就可以直接使用(明確知道表單中有多少個檔案上傳);如果不確定表單中有多少個檔案上傳,不適合挨個去取(效率不高),可以通過遍歷$_FILES陣列,挨個取出來實現檔案上傳

foreach($_FILES as $file){
    //$file就是一個完整的上傳檔案資訊
    //找到臨時路徑,指定存放路徑
    if (is_uploaded_file($file['tmp_name'])){
        //儲存
        move_uploaded_file($file['tmp_name'],'uploads/' . $file['name']);
    }
}

2、同名多檔案上傳:

想辦法得到一個檔案對應的五個元素陣列。從$_FILES中把對應的name/tmp_name/size/error/type 挨個取出來,然後存放到不同的陣列中

此時遍歷$_FILES沒有意義,只有一個數組元素;應該遍歷$_FILES['userfile'] ['任意一個要素:name/tmp_name/size/error/type']

    //判斷元素存在而且是陣列:name有:代表是檔案,name元素有多個,代表是同名批量上傳
if(isset($_FILES['image']['name']) && is_array() ){
    //遍歷,構造陣列元素
    $image = array();        //儲存所有的檔案資訊,一個元素代表一個檔案(陣列)
    foreach($_FILES['image']['name'] as $k => $file){

        $images = array(
            'name' => $file ,
            'tmp_name' => $_FILES['image']['tmp_name'][$k],
            'type' => $_FILES['image']['type'][$k],
            'error' => $_FILES['image']['error'][$k],
            'size' => $_FILES['image']['size'][$k]
        );        
    }
}