PHP+MySQL互動式網頁程式設計班 檔案上傳程式設計 講師:林業峻 CSIE, NTU 7 / 3, 2010
課程大綱 HTML表單元件:檔案上傳 PHP檔案上傳相關語法 使用MySQL管理上傳檔案 下載來自MySQL的檔案
使用網頁上傳檔案的原理 HTML提供了檔案上傳的表單元件,提供使用者使 用表單將檔案傳到網站主機。 網站可透過PHP程式接收檔案相關資訊,並將檔 案搬到網頁資料夾以供使用者連結。 送出網址 +表單內容 暫存檔 新檔名.jpg .htm (.php) 表單 .php 處理表單 回傳php輸出資料 網站 個人電腦 網站伺服器
HTML表單:檔案上傳 當表單中有需要用到檔案上傳時,method要用 POST ,且需要把form裡的enctype設為 multipart/form-data。 HTML語法: <form method="POST" enctype="multipart/form-data" action="目標頁面" > <input…> … </form> 補充說明: enctype中有兩種屬性 application/x-www-form-urlencoded (預設值) multipart/form-data (檔案上傳用)
表單元件:檔案上傳 使用時機:用來上傳一個檔案到網站電腦。 語法: 運作: <input type="file"> name: 元件名稱 size: 字元寬度 運作: 將元件名稱name的本機檔案內容以POST方式將二進位檔傳 送到網站主機。 <html> <head><title>PHP範例程式</title></head> <body> <form method="POST" enctype="multipart/form-data" action="file_action.php"> <input type="file" name="F1" size="20"><br> <input type="submit" value="送出" name="B1"><br> </form> </body> </html>
課程大綱 HTML表單元件:檔案上傳 PHP檔案上傳相關語法 使用MySQL管理上傳檔案 下載來自MySQL的檔案
PHP接收檔案的步驟 使用超級全域變數取得檔案資訊 判斷檔案是否存在? 否:直接將暫存檔搬動到目前網頁所在地並回復檔名 是:後續處理 (顯示上傳失敗, 覆蓋檔案, 修改檔名)
STEP1: 超級全域變數$_FILES 使用超級全域變數$_FILES來取得檔案資料 檔案屬性 使用範例:檔案F1之檔案資訊如下 用來接收來自表單的檔案上傳表單元件所指定的檔案 檔案屬性 name: 檔案名稱 type: 檔案類型 size: 檔案大小 tmp_name: 暫存檔名稱 使用範例:檔案F1之檔案資訊如下 $_FILES['F1']['name'] $_FILES['F1']['type'] $_FILES['F1']['size'] $_FILES['F1']['tmp_name']
範例 chap07/files.htm files_action.php files.htm <html> <head><title>PHP範例程式</title></head> <body> <form method="POST" enctype="multipart/form-data" action="file_action.php"> <input type="file" name="F1" size="20"><br> <input type="submit" value="送出" name="B1"><br> </form> </body> </html> files_action.php <html> <head><title>PHP範例程式</title></head> <body> <? $F1_name = $_FILES['F1']['name']; $F1_type = $_FILES['F1']['type']; $F1_size = $_FILES['F1']['size']; $F1_tmp_name = $_FILES['F1']['tmp_name']; echo "檔案名稱:$F1_name<br>"; echo "檔案類型:$F1_type<br>"; echo "檔案大小:$F1_size<br>"; echo "暫存檔名稱:$F1_tmp_name<br>"; ?> </body> </html> files.htm
STEP2: 判斷檔案是否存在 如果同一個檔名的檔案已經存在於網站資料夾中 ,會造成資料直接被覆蓋。因此需要檢察看看檔 案是否存在,再做進一步的處理。 PHP判斷檔案是否存在之函式 file_exists("檔案名稱")
搬動暫存檔並回復檔名 經由網頁上傳的檔案,系統會先將它重新取個名 字放在電腦的某個地方,我們需要用程式將它搬 到網站的資料夾。 PHP搬動暫存檔到網站並回復檔名之函式 move_uploaded_file ("暫存檔名","檔案名稱")
範例 chap07/file_move.htm file_move.htm file_move_action.php <html> <head><title>PHP範例程式</title></head> <body> <form method="POST" enctype="multipart/form-data" action="file_move_action.php"> <input type="file" name="F1" size="20"><br> <input type="submit" value="送出" name="B1"><br> </form> </body> </html> <html> <head><title>PHP範例程式</title></head> <body> <? $F1_name = $_FILES['F1']['name']; $F1_type = $_FILES['F1']['type']; $F1_size = $_FILES['F1']['size']; $F1_tmp_name = $_FILES['F1']['tmp_name']; if( file_exists("file/$F1_name" )) { echo "檔案已存在"; } else move_uploaded_file($F1_tmp_name, "file/$F1_name"); echo "檔案上傳完畢"; ?> </body> </html> file_move.htm file_move_action.php
檔案已存在的後續處理 如果同檔名的檔案已經存在於網站資料夾中,程 式設計師可以依照情況選擇用下面三種方法處理 顯示上傳失敗 覆蓋檔案 修改檔名 顯示上傳失敗可以直接用echo印出訊息 覆蓋檔案則直接用move_uploaded_file 其中我們來看修改檔名該如何處理
修改檔名 如果同檔名的檔案已經存在於網站資料夾中,我 們可以用下面方法對檔名開頭加註一個編號。 $i = 1; 新檔名 = 原檔名; while(1) { if (新檔名之檔案存在) 新檔名 = 原檔名開頭加一個編號 $i ; $i 遞增1; } else 搬動暫存檔到網站並給目前產生的檔名; 離開迴圈;
範例 chap07/file_rename.htm file_rename.htm file_rename_action.php <html> <head><title>PHP範例程式</title></head> <body> <? $F1_name = $_FILES['F1']['name']; $F1_type = $_FILES['F1']['type']; $F1_size = $_FILES['F1']['size']; $F1_tmp_name = $_FILES['F1']['tmp_name']; $i=1; $F1_name_new = $F1_name; while(1) { if( file_exists("file/$F1_name_new") ) $F1_name_new = $i . "_" . $F1_name; $i++; } else move_uploaded_file($F1_tmp_name, "file/$F1_name_new"); break; echo "檔案上傳完畢, 檔名: $F1_name_new"; ?> </body> </html> <html> <head><title>PHP範例程式</title></head> <body> <form method="POST" enctype="multipart/form-data" action="file_rename_action.php"> <input type="file" name="F1" size="20"><br> <input type="submit" value="送出" name="B1"><br> </form> </body> </html> file_rename.htm file_rename_action.php
練習 試著使用PHP將上一章的通訊錄之新增功能改成 可以上傳使用者圖片,並將檔名能夠插入MySQL 之addressbook資料表中。
課程大綱 HTML表單元件:檔案上傳 PHP檔案上傳相關語法 使用MySQL管理上傳檔案 下載來自MySQL的檔案
使用MySQL管理檔案 使用PHP+MySQL建立一個線上檔案管理系統。 範例:chap07/document.php
使用MySQL管理上傳檔案 使用步驟 建立MySQL檔案上傳資料表 建立HTML檔案上傳表單網頁 使用PHP接收並處理檔案
STEP1: MySQL檔案上傳資料表 在MySQL中,建立一個document資料表,其中 欄位包括: sn: 資料序號 name: 檔案名稱 type: 檔案類型 size: 檔案大小 title: 檔案說明 file: 檔案內容
BLOB類型 在MySQL中,使用BLOB來存取一個檔案,其中 相關類似包括: PHP預設最大上傳檔案大小為2MB TINYBLOB: 最大容量255Bytes BLOB: 最大容量約64KB MEDIUMBLOB: 最大容量約16MB LONGBLOB: 最大容量約4GB PHP預設最大上傳檔案大小為2MB
STEP2: HTML檔案上傳表單網頁 在HTML表單中,建立一個檔案上傳元件、文字方 塊、送出按鈕: 檔案上傳: name=F1 文字方塊: name=T1 送出按鈕: name=B1 (按鈕名稱無所謂,之後用不到) (chap07/document_add.php)
STEP3: PHP接收並處理檔案 使用超級全域變數$_FILES接收檔案資訊。 這次我們不使用資料搬動的方式,而是要將暫存 檔以二進位檔方式讀出再傳到MySQL PHP二進位開檔與讀檔之函式 $fd = fopen("檔案名稱", "rb") 將檔案以二進位讀取模式(rb), 以檔案識別變數開啟 $file = fread($fd, 檔案大小) 將檔案識別變數所代表的檔案讀出指定單位大小放到$file變數中 PHP將檔案中之特殊字元前加入'\'之函式 $file = addslashes($file) 資料要傳到MySQL是透過SQL語法,如同之前所說在字串的雙引號中, 有些文字代表特殊效果,所以需要在前加 \ 例如: $, ", ', \, ...
STEP4: 插入MySQL表單 資料準備就讀後,呼叫mysql_query用SQL之 INSERT命令把資料傳到MySQL中的資料表中即可 完全檔案上傳之動作 (程式碼見: chap07/document_add_action.php)
課程大綱 HTML表單元件:檔案上傳 PHP檔案上傳相關語法 使用MySQL管理上傳檔案 下載來自MySQL的檔案
還原MySQL中的檔案 當使用者想透過網頁將檔案讀出時,程式設計師 必須使用PHP將MySQL中的檔案讀出,並還原當 初使用者上傳之檔名讓使用者下載。 PHP產生網頁標頭之函式 header("內容"); 有用的範例 通知網頁瀏覽器以某檔案類型開啟此檔 header("Content-type: 檔案類型"); 回復檔案名稱並以提供下載 header("Content-Disposition: attachment; filename=檔案名稱"); (程式碼見: chap07/document_download.php)