文件上傳、下載原理
步驟內容:
步驟1:控制上傳文件,通過php.ini文件配置。
步驟2:對上傳文件進行判斷。上傳文件的大小,格式等。
步驟3:執行上傳文件的操作方法。
1.控制上傳文件:
php通過對php.ini對上傳文件進行控制,包括:是否支持上傳、上傳文件的臨時目錄、上傳文件的大小、指令執行的時間與指令分配的內存空間。
在php.ini文件中定位到file uploads選項,完成對上述選項的設置。選項含義如下:
file_uploads:如果是on,說明服務器支持文件上傳,如果為off,則不支持。一般默認是支持的,此選項不必修改。
upload_tem_dir:上傳文件的臨時目錄。在文件上傳成功之前,文件首先保存在服務器的臨時目錄中。多數使用系統默認目錄,但是也可以自行設置。
upload_max_filesize:服務器允許上傳文件的最大值,以MB為單位。系統默認為2MB,若超過則須修改其值。
max_execution_time:php中一個指令所能執行的最長時間,單位是秒。該指令在執行上傳超大文件時必須修改,否則及時上傳文件在服務器允許的範圍內,但是超過指令所能執行的最長時間,仍然無法實現上傳。
memory_limit:php中一個指令所分配的內存空間,單位時MB。它的大小同樣會影響到超大文件的上傳。
備註:在客戶端中控制上傳文件應用的時form表單中的enctype和method屬性,以及隱藏域MAX_FILE_SIZE.
enctype="multipart/form-data":指定表單編碼數據方式。
method="post":指定數據傳輸的方式。
<input type="hiden" name="MAX_FILE_SIZE" value="1000"/>:通過隱藏域控制上傳文件的大小,單位為字節。該值不能超過php.ini配置文件中的upload_max_filesize選項設置的值。它不能完全控制上傳文件的大小,只能避免一些不必要的麻煩。
2.判斷上傳文件
對上傳文件進行判斷應用的是全局變量$_FILES,$_FILES是一個數組,它包含所有上傳文件的信息。數組中各個元素含義如下:
$_FILES[filename][name]:存儲上傳文件的文件名,如text.txt,title.jpg等。
$_FILES[filename][size]:存儲文件的大小,單位為字節。
$_FILES[filename][tem_name]:存儲文件在臨時目錄中使用的文件名,因為文件在上傳時首先要將其以臨時文件的身份存儲在臨時目錄中。
$_FILES[filename][type]:存儲上傳文件的MIME類型。MIME規定各種文件格式的類型,每種MIME類型都時由“/”分隔的主類型和子類型組成。例如:"image/gif"的主類型為圖像,子類型為GIF格式的文件。"text/html"代表文本的HTML文件。
$_FILES[filename][error]:存儲文件上傳的錯誤代碼:此項目為PHP4.2.0版本中新增內容。它的返回值由5種:
0:表示沒有任何錯誤。文件上傳成功。
1:表示上傳文件的大小超出配置文件指令upload_max_filesize選項的限定值。
2:表示上傳文件的大小超出HTML表單中max_file_size選項所指定的值。
3:表示文件只被上傳了一部分。
4:表示沒有上傳任何文件。
例子: <?php /*判斷是否由上傳圖片*/ if (! empty ( $_FILES [ 'up_picture' ][name])){ /*將圖片信息賦值給變量*/ $type= strtolower ( strstr ($_FILES[ 'up_picture' ][name], "." )); if ( $type != '.jpg' && $type != '.gif' ) echo "你上傳的文件格式不對" ; else { if ($_FILES[ 'up_picture' ][size]<2000000 && $_FILES[ 'up_picture' ][size]>0){ echo "上傳文件名稱:" .$_FILES[ 'up_picture' ][name]. "<br/>" ; echo "上傳文件類型:" .$type. "<br/>" ; echo "上傳文件大小:" .$_FILES[ 'up_picture' ][size]. "<br/>" ; } else echo "圖片大小不符合要求。" ; } } ?> |
3.文件上傳。
php中應用move_uploaded_file()函數實現文件上傳。但在執行之前,為了防止潛在的攻擊對原本不能通過腳本交互的文件進行非法管理,可以先應用is_uploaded_file()函數判斷指定的文件是否通過HTTP POST上傳的,如果是則返回true。通過該函數,可以確保惡意的用戶無法欺騙腳本去訪問不能訪問的文件。
bool is_uploaded_file(string name);//用於判斷指定的文件是否通過HTTP POST上傳的。filename必須類似於$_FILES[‘filename’][‘temp_name’]的變量,不可以使用從客戶端上傳的文件名$_FILES[‘filename’][‘name’]。
move_upload_file(string filename,string destination);//該函數用於將文件上傳到服務器中指定的位置。如果成功,則返回true,否則返回false。filename指定上傳文件的臨時文件名,即$_FILES['tmp_name'],參數destination指定文件上傳後保存的新路徑和名稱。如果參數不是合法的上傳文件,不會出現任何操作,該函數將返回false。如果是合法的上傳操作,但是由於某些原因無法移動,則不會出現任何操作,返回false的同時將會發出一條警告。
<?php if ( ! empty ( $_FILES [ 'up_picture' ][ 'name' ])){ if ( $_FILES [ 'up_picture' ][ 'error' ] > 0){ echo "上傳錯誤!" ; switch ( $_FILES [ 'up_picture' ][ 'error' ]){ case 1: echo "上傳文件超出配置文件規定值" ; break ; case 2: echo "上傳文件超出表單規定值" ; break ; case 3: echo "上傳文件不全" ; break ; case 4: echo "沒有上傳文件" ; break ; } } else { if ( ! is_dir ( './upfile/' ) ) mkdir ( './upfile/' ); $path = './upfile/' .time(). $_FILES [ 'up_picture' ][ 'name' ]; if ( is_uploaded_filed( $_FILES [ 'up_picture' ][ 'tmp_name' ] )){ if (!move_uploaded_file( $_FILES [ 'up_picture' ][ 'tmp_name' ] , $path )){ echo "上傳失敗!" ; } else { echo "文件" .time(). $_FILES [ 'up_picture' ][ 'name' ] . "上傳成功,大小為:" . $_FILES [ 'up_picture' ][ 'size' ] ; } } else { echo "上傳文件" . $_FILES [ 'up_picture' ][ 'name' ]. "不合法" ; } } } ?> |
4.文件下載
這裡介紹通過http方式下載文件,主要用到header()函數。header()函數屬於HTTP函數,其作用是以HTTP將HTML文檔的表頭送到瀏覽器,並告訴瀏覽器具體怎麼處理這個頁面。
void header(string string[,bool replace[,int http_respone_code]]);//參數string 指定發送的標頭。參數replace控制如果一次發送多個標頭,對於相似的標頭是替換還是添加。如果是false,則強制發送多個同類型的標頭,默認為true。參數http_respone_code強制將HTTP響應代碼設置為指定值:
下載步驟如下:
a):通過"Content-Type" 指定文件的MIME類型。
b):通過"Content-Disposition" 對文件進行描述,值"attachment;filename="test.jpg"" 說明是一個福建,同時指定下載文件的名稱。
c):通過"Content-Length" 設置下載文件的大小。
d):通過readfile()函數讀取文件內容。
例如: header( 'Content-Type:image/jpg' ); header( ' Content-Disposition:attachment;filename="test.jpg" ' ); header( 'Content-Length:' . filesize ( 'test.jpg' ) ); readfile( 'test.jpg' ); |
5.訪問遠程文件
步驟1:配置 php.ini 文件選項 allow_url_fopen設置為on。參數默認是開啓的,允許打開http和ftp指定的遠程文件。如果 allow_url_fopen設置為off,則不允許打開遠程文件。
步驟2:使用fopen()函數讀取文件內容。根據內容創建你想要的資源,保存到本地。