一、上傳檔案首先要在php.ini裡按自己的需求進行相應配置。
有以下幾個重要的配置單:
選項 |
預設值 |
說明 |
post_max_size |
8M |
控制以後的POST請求的最大規模。必須大於upload_max_filesize選項值。 |
max_input_time |
60 |
指定一個POST請求提交所有資料可以花費的時間。以秒為單位。在此時間之後結束資料提交。 |
memory_limit |
128M |
一個指令碼頁所能消耗的最大記憶體。 |
max_execution_time |
30 |
指令碼最大執行時間。以秒為單位。 |
file_uploads |
On |
指出是否允許檔案上傳。預設值為on |
upload_max_filesize |
2M |
控制PHP接受的最大檔案規模。如果檔案太大,PHP就寫入一個0位元組的預留位置檔案。 |
upload_tmp_dir |
NULL |
必須設定為一個有效目錄。可以將上傳的檔案放在這裡等候處理。 |
1. 一般的php檔案上傳,除非檔案很小.就像一個5M的檔案,很可能要超過一分鐘才能上傳完.
但在php中,預設的該頁最久執行時間為 30 秒.就是說超過30秒,該指令碼就停止執行.
這就導致出現 無法開啟網頁的情況.這時我們可以修改 max_execution_time
在php.ini裡尋找
max_execution_time
預設是30秒.改為
max_execution_time = 0 0表示沒有限制
以上修改的是php上傳檔案中指令碼執行逾時時間
2. 修改 post_max_size 設定 POST 資料所允許的最大大小。此設定也影響到php上傳檔案。
php預設的post_max_size 為2M.如果 POST 資料尺寸大於 post_max_size $_POST 和 $_FILES superglobals 便會為空白.
尋找 post_max_size .改為
post_max_size = 150M
3. 很多人都會改了第二步.但php上傳檔案時最大仍然為 8M.
為什麼呢.我們還要改一個參數upload_max_filesize 表示所上傳的檔案的最大大小。
尋找upload_max_filesize,預設為8M改為
upload_max_filesize = 100M
另外要說明的是在php檔案上傳中,post_max_size 大於 upload_max_filesize 為佳.
二、在HTML表單中設定上傳
需要注意三個地方:
- 將form表單提交方式設為POST
- 添加一個“file”類型的<input>標籤(如果是多檔案上傳,添加多個)
- 將enctype屬性添加到表單中,表示將使用新的multipart/form-data MIME類型。
提交資料以後,伺服器通過超級全域數組$_FILES訪問提交的檔案。這個數組包含的元素個數為表單file個數相同。例如:如果表單裡有一個上傳檔案的選框:
<input type=”file” name=”filename”>
當提交資料後,可以通過$_FILES[‘filename’]來取得這個檔案的資訊。該資訊如下:
$_FILES[‘filename’]:
[‘name’] => 檔案名稱
[‘type’] => 檔案MIME類型。如image/jpeg, text/plain,
application/octet-stream等。
[‘tmp_name’] => 如果檔案小於允許上傳檔案大小,則該位置表示上傳的檔案臨時存放路徑及臨時檔案名稱,被放在upload_tmp_dir所指定的位置。
[‘error’] => 錯誤碼。
[‘size’] => 檔案大小。
其中error錯誤碼可能的值如下表:
編碼 |
值 |
說明 |
UPLOAD_ERR_OK |
0 |
檔案成功上傳 |
UPLOAD_ERR_INI_SIZE |
1 |
檔案大小比php.ini中upload_max_filesize指定值要大 |
UPLOAD_ERR_FORM_SIZE |
2 |
檔案的 小比表單的MAX_FILE_SIZE指定的值大 |
UPLOAD_ERR_PARTIAL |
3 |
檔案上傳不完整(可能因為請求時間過長被終止) |
UPLOAD_ERR_NO_FILE |
4 |
沒有檔案隨著這個請求上傳 |
UPLOAD_ERR_NO_TMP_DIR |
6 |
在php.ini中沒有指定臨時檔案夾 |
只有當$_FILES[‘filename’][‘error’]的值為0時,才應該繼續處理檔案。
單檔案上傳HTML結構樣本:
<form action="" method="post" enctype="multipart/form-data"><p>File:<input type="file" name="filename" /><input type="submit" value="Send" /></p></form>
多檔案上傳HTML結構樣本:
<form action="" method="post" enctype="multipart/form-data"><p>Files:<input type="file" name="filename[]" /><input type="file" name="filename[]" /><input type="file" name="filename[]" /><input type="submit" value="Send" /></p></form>
三、php服務端對資料進行處理
像檔案大小和類型限制、分目錄存放、檔案資訊入庫等操作,都可以根據需要自行處理,這裡給一個簡單的例子:
include_once 'conn/conn.php';$filename = $_FILES['filename']['name'];//讀取上傳檔案名稱,並存為數組$filetype = $_POST['foundtype'];//讀取上傳檔案的類別$tmpname = $_FILES['filename']['tmp_name'];//讀取臨時檔案名稱,並存為數組$tmpsize = $_FILES['filename']['size'];//上傳檔案大小$tmppub = $_POST['ispub'];//是否公開$file_path = 'upfile/';$max = 0;if(!is_null($tmpsize)){foreach($tmpsize as $value){$max += $value;}if($max > 100000000 or $max <= 0){echo '<script>alert("上傳檔案總大小大於100M,請重新選擇1");location="'.$_SERVER['HTTP_REFERER'].'";</script>';}}else{/*var_dump($tmpsize);exit();*/echo '<script>alert("上傳檔案錯誤,請重新檢查程式");location="'.$_SERVER['HTTP_REFERER'].'";</script>';}$chkdownnum = '';for($i = 0; $i < 15; $i++){$chkdownnum .= dechex(rand(0,15));}for ($i = 0; $i < count($filename); $i++){//通過迴圈將多個檔案全部上傳move_uploaded_file($tmpname[$i],$file_path.$filename[$i]);//添加進資料庫$insertsql = 'insert into tb_upfile (filename,filepath,filetype,upauthor,chkdownnum,ispub) values("'.trim($filename[$i]).'","'.$file_path.$filename[$i].'","'.$filetype[$i].'","'.$_SESSION['name'].'","'.trim($chkdownnum).'",'.$tmppub[$i].')';$conne->uidRst($insertsql);}echo '<div style=" padding-top: 30px;">檔案上傳成功!</div>';
這裡推薦幾個蠻好用的jquery外掛程式:uploadify(flash版/html5版)jQuery File Upload (html5)plupload(多種runtime支援)