使用PHP程式一次上傳多個檔案
文∕趙英傑
本文旨在補充《碼上就會:Dreamweaver CS3 PHP、MySQL與AJAX》書本第十章「使用PHP接收上傳檔案」一節,說明接收多個上傳檔案的PHP程式寫法。這個程式其實和上傳單一檔案的架構大同小異,只是前端HTML網頁不止一個「檔案上傳」表單欄位,而後端的PHP程式則多了迴圈敘述,處理所有檔案上傳欄位。
為了方便迴圈敘述處理,每個「檔案上傳」表單欄位名稱後面,都刻意加上數字編號,例如,第一個欄位名稱是file0、第二個是file1…以此類推。
本程式僅允許用戶上傳.JPG, .JPEG和.GIF副檔名的檔案,進一步驗證上傳檔是否真的是影像格式,並且建立縮圖的程式寫法,請參閱「重新命名上傳檔名以及建立縮圖」一節(10-19頁)。
若副檔名及檔案大小經過確認無誤後,即可透過move_uploaded_file()函數,將上傳檔移入指定的資料夾。
底下的PHP函數用來檢查指定的檔案是否已透過HTTP POST方式上傳,若是,此函數將傳回 true:
is_uploaded_file(檔名)
完整的PHP程式及註解說明如下:
<?php // 上傳檔將存入此路徑裡的 uploads 資料夾 $upload_dir = "uploads/"; // 上傳檔總數 $total_uploads = 3; // 上傳檔大小限制,此處限制為400KB $size_bytes =400 * 1024; // 副檔名限制 $limitedext = array(".gif",".jpg",".jpeg"); echo "<h3>上傳結果</h3>"; // 用迴圈讀取上傳欄位資料 for ($i = 0; $i < $total_uploads; $i++) { $new_file = $_FILES['file'.$i]; // 讀取上傳檔名 $file_name = $new_file['name']; // 把檔名中的空格替換成 "_" $file_name = str_replace(' ', '_', $file_name); // 存入暫存區的檔名 $file_tmp = $new_file['tmp_name']; // 檔案大小 $file_size = $new_file['size']; // 判斷欄位是否指定上傳檔案… if (!is_uploaded_file($file_tmp)) { // 沒有上傳檔,顯示訊息。 echo "欄位 $i: 沒有選取上傳檔案。<br />"; }else{ // 若有上傳檔,則取出該檔案的副檔名 $ext = strrchr($file_name,'.'); // 判斷副檔名是否符合預期 if (!in_array(strtolower($ext),$limitedext)) { // 不符合預期,顯示錯誤訊息。 echo "欄位 $i: ($file_name) 的檔案副檔名有誤 (只允許GIF和JPEG檔) <br />"; }else{ // 檢查檔案是否太大 if ($file_size > $size_bytes){ echo "欄位 $i: ($file_name) 無法上傳,請檢 查檔案是否小於 ". $size_bytes / 1024 . " KB。<br />"; }else{ if (move_uploaded_file($file_tmp, $upload_dir.$file_name)) { echo "欄位 $i: ($file_name) 上傳成功!<br />"; }else{ echo "欄位 $i: 無法上傳。<br />"; } } } } } ?>
請按此連結下載程式原始碼。
感謝趙老師的補充教材…:razz:
不客氣 😉
請問上傳成功後要如何將這些路徑全部傳到書本(10-10)的地方 顯示
再個別存入資料庫~謝謝
需要一次上傳多張圖片的場合,通常都是資料處理流程中有這樣的需求,例如,您可能製作了一個讓用戶發文的表單,並允許用戶在其中插入多張圖片。這樣的話,資料表就要定義多個儲存圖片資料的欄位;或者把所有圖片位址連同內文嵌入一個欄位。
書本10-10頁的範例中,每一筆資料僅需要一張圖片,若把資料的輸入流程改成一次把照片傳入不同的記錄,再個別修改這些記錄的文字,不僅增加程式的難度,也不見得容易使用。以上說明提供您參考,謝謝!
謝謝您的回答
若全部資料只是存入一個欄位,那呈現時如何讓每張圖正常顯示,
存入應該是每一筆上傳圖片路徑的資料
若要存入同一個欄位,可以將圖檔位址包在HTML的 img 標籤裡面,這樣就能讓它們一齊顯示在網頁上了。
雖然不認識你
但謝謝你~
無意間在網路上搜尋到這篇文章
對我很有幫助^^
🙂
很棒的書喔….一直到今日都還在向朋友推薦這本書!!
加油喔~~期待您下一本鉅著!!:lol:
說鉅著不敢當,很高興對讀者有幫助,謝謝!
這本金石堂都買不到了
有些書籍經銷商會在Yahoo和露天拍賣網站銷售書籍,建議您到這些網站上找找,謝謝!
請問要如何一次上傳到不同SQL欄位呢??
同一個主鍵
請問要怎寫入資料庫呢@@?
通常我們不會直接把檔案寫入資料庫,而是在資料庫中紀錄上傳的文件檔名。只要在for迴圈當中加入SQL的INSERT INTO子句即可。
你好~~再請問一下~~如果是用DREAMWEAVER的插入紀錄要怎弄到FOR裡面押??
Dreamweaver內建的行為指令功能有限,所以通常都要自行修改程式碼,這就是為何有了Dreamweaver,還要學習PHP語法的原因。
請問要加在哪?@@
加在for一開始?還是if else?
可以增加文字欄位嗎?
我是想弄成圖片各別寫入不同資料庫欄位但是同一主鍵~
$insertSQL = sprintf(“INSERT INTO photo (file1, file2, file3) VALUES (%s, %s, %s)”,
GetSQLValueString($file1 , “text”),
GetSQLValueString($file2, “text”),
GetSQLValueString($file3, “text”));
是這樣嗎??
對,如果是一次輸入三個欄位的值,就可以用上面的語法,不需要用到for迴圈。
😥 請問如果要讓上傳結果輸出到一個DIV裡面該怎做呢.
無意GOOGLE到這篇文章!對我幫助不小
真是感謝大大
趙老師~我看了妳的書想要寫出一個多檔案上傳+檔名寫入資料庫+更新檔案+更新資料庫!= =想了一天了還是想不出來怎麼寫請問有沒有範例= =insert.ph跟update.php這兩個頁面寫不出來= =怎麼辦可有例可以寄給我嗎?感謝
hi roger:
我過幾天傳上來。
thanks,
jeffrey
感謝~我以經寫出來了~呵呵:grin:
恭喜,恭喜!感謝告知 😉
請問老師
如果是要像奇摩部落格那樣
全選整批上傳
而不是像你這範例一個一個選100次
要怎麼做????
hi 佳佳:
我沒用過奇摩部落格,我猜想他們可能是用自家的Yahoo UI(簡稱YUI)程式模組來製作的。
妳可以在這個YUI網站下載多重檔案上傳的程式碼,它的前端採用Flash + JavaScript 實作。這個YUI Demo網頁則有多重檔案上傳的程式示範。
have fun!
jeffrey
版主你好, 想請教
upload.php用了以下程式, 相片是中文名的, 共加入了3張相片, 但加入資料庫時, 欄位file1, file2顯示/tmp/phpj9uhS0及/tmp/phpxfdA19, 但我共加入了三張, 請問是什麼問題, 如何在這些欄位用中文名, 我的程式如下:
上傳結果”;
// 用迴圈讀取上傳欄位資料
for ($i = 0; $i “;
}else{
// 若有上傳檔,則取出該檔案的副檔名
$ext = strrchr($file_name,’.’);
// 判斷副檔名是否符合預期
if (!in_array(strtolower($ext),$limitedext)) {
// 不符合預期,顯示錯誤訊息。
echo “欄位 $i: ($file_name) 的檔案副檔名有誤(只允許GIF和JPEG檔) “;
}else{
// 檢查檔案是否太大
if ($file_size > $size_bytes){
echo “欄位 $i: ($file_name) 無法上傳,請檢查檔案是否小於 “. $size_bytes / 1024 .” KB。”;
}else{
if (move_uploaded_file($file_tmp,iconv(“utf8″,”Big5”,$upload_dir.$file_name))) {
echo “欄位 $i: ($file_name) 上傳成功!”;
}else{
echo “欄位 $i: 無法上傳。”;
}
}
}
}
}
mysql_query(“SET NAMES ‘utf8′”);
if (!function_exists(“GetSQLValueString”)) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = “”, $theNotDefinedValue = “”)
{
if (PHP_VERSION
未能顯示全部, 續上面, (ken)
mysql_query(“SET NAMES ‘utf8′”);
if (!function_exists(“GetSQLValueString”)) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = “”, $theNotDefinedValue = “”)
{
if (PHP_VERSION
你好!請問如果一次傳多個檔案…..可以檢查嗎??….php初學者……謝謝!
欄位名稱不用file1~file5
命名file[]就可以了
非常感謝 😉
thanks,
jeffrey
請問…
我如果上傳的檔名為中文要修正哪呢? 系統出現下面提示
Warning: move_uploaded_file(林謹.jpg) [function.move-uploaded-file]: failed to open stream: Invalid argument in C:\AppServ\www\1\img\upload.php on line 45
Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move ‘C:\WINDOWS\temp\phpF683.tmp’ to ‘林謹.jpg’ in C:\AppServ\www\1\img\upload.php on line 45
無法上傳。
hi sam:
大致有兩種解決方法:
1. 讓PHP重新命名上傳檔案,並選擇性地將舊檔名記錄在資料庫裡,以便將來在網頁上顯示或者提供下載時,再改回原始檔名。
2. 使用mb_convert_encoding()或iconv()將UTF-8萬國碼轉換成Big5試試看,這兩個函數的語法範例如下(BIG5和UTF-8參數的位置不一樣):
$big5Str1 = mb_convert_encoding(“中文檔名.jpg”, ‘BIG5’, ‘UTF-8’);
$big5Str2 = iconv(‘UTF-8′,’BIG5’,”中文檔名.jpg”);
have fun!
jeffrey
您好!
請問一下~
如果只有一個上傳的按鈕,但是按了之後要選好幾個檔案上傳到MYSQL
這樣要如何做出來呢? 感謝^^
hi thunder:
有很多現成、好用的程式庫可用,我之前用過這個”jQuery File Upload“,支援直接拖曳多個檔案到瀏覽器視窗上傳,在它的server/php資料夾,也包含上傳與影像處理的PHP程式碼,提供你參考。
thanks,
jeffrey