使用PHP程式一次上傳多個檔案

使用PHP程式一次上傳多個檔案
文∕趙英傑

本文旨在補充《碼上就會:Dreamweaver CS3 PHP、MySQL與AJAX》書本第十章「使用PHP接收上傳檔案」一節,說明接收多個上傳檔案的PHP程式寫法。這個程式其實和上傳單一檔案的架構大同小異,只是前端HTML網頁不止一個「檔案上傳」表單欄位,而後端的PHP程式則多了迴圈敘述,處理所有檔案上傳欄位。

上傳檔案程式

為了方便迴圈敘述處理,每個「檔案上傳」表單欄位名稱後面,都刻意加上數字編號,例如,第一個欄位名稱是file0、第二個是file1…以此類推。

本程式僅允許用戶上傳.JPG, .JPEG和.GIF副檔名的檔案,進一步驗證上傳檔是否真的是影像格式,並且建立縮圖的程式寫法,請參閱「重新命名上傳檔名以及建立縮圖」一節(10-19頁)。

若副檔名及檔案大小經過確認無誤後,即可透過move_uploaded_file()函數,將上傳檔移入指定的資料夾。

搬移上傳檔

底下的PHP函數用來檢查指定的檔案是否已透過HTTP POST方式上傳,若是,此函數將傳回 true:

完整的PHP程式及註解說明如下:

請按此連結下載程式原始碼

37 thoughts on “使用PHP程式一次上傳多個檔案

  1. 需要一次上傳多張圖片的場合,通常都是資料處理流程中有這樣的需求,例如,您可能製作了一個讓用戶發文的表單,並允許用戶在其中插入多張圖片。這樣的話,資料表就要定義多個儲存圖片資料的欄位;或者把所有圖片位址連同內文嵌入一個欄位。

    書本10-10頁的範例中,每一筆資料僅需要一張圖片,若把資料的輸入流程改成一次把照片傳入不同的記錄,再個別修改這些記錄的文字,不僅增加程式的難度,也不見得容易使用。以上說明提供您參考,謝謝!

  2. 謝謝您的回答
    若全部資料只是存入一個欄位,那呈現時如何讓每張圖正常顯示,
    存入應該是每一筆上傳圖片路徑的資料

  3. 通常我們不會直接把檔案寫入資料庫,而是在資料庫中紀錄上傳的文件檔名。只要在for迴圈當中加入SQL的INSERT INTO子句即可。

  4. Dreamweaver內建的行為指令功能有限,所以通常都要自行修改程式碼,這就是為何有了Dreamweaver,還要學習PHP語法的原因。

  5. 請問要加在哪?@@
    加在for一開始?還是if else?
    可以增加文字欄位嗎?

    我是想弄成圖片各別寫入不同資料庫欄位但是同一主鍵~

    $insertSQL = sprintf(“INSERT INTO photo (file1, file2, file3) VALUES (%s, %s, %s)”,
    GetSQLValueString($file1 , “text”),
    GetSQLValueString($file2, “text”),
    GetSQLValueString($file3, “text”));

    是這樣嗎??

  6. 趙老師~我看了妳的書想要寫出一個多檔案上傳+檔名寫入資料庫+更新檔案+更新資料庫!= =想了一天了還是想不出來怎麼寫請問有沒有範例= =insert.ph跟update.php這兩個頁面寫不出來= =怎麼辦可有例可以寄給我嗎?感謝

  7. hi 佳佳:

    我沒用過奇摩部落格,我猜想他們可能是用自家的Yahoo UI(簡稱YUI)程式模組來製作的。

    妳可以在這個YUI網站下載多重檔案上傳的程式碼,它的前端採用Flash + JavaScript 實作。這個YUI Demo網頁則有多重檔案上傳的程式示範。

    have fun!
    jeffrey

  8. 版主你好, 想請教

    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

  9. 未能顯示全部, 續上面, (ken)
    mysql_query(“SET NAMES ‘utf8′”);
    if (!function_exists(“GetSQLValueString”)) {
    function GetSQLValueString($theValue, $theType, $theDefinedValue = “”, $theNotDefinedValue = “”)
    {
    if (PHP_VERSION

  10. 請問…
    我如果上傳的檔名為中文要修正哪呢? 系統出現下面提示

    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
    無法上傳。

    1. 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

  11. 您好!
    請問一下~
    如果只有一個上傳的按鈕,但是按了之後要選好幾個檔案上傳到MYSQL
    這樣要如何做出來呢? 感謝^^

    1. hi thunder:

      有很多現成、好用的程式庫可用,我之前用過這個”jQuery File Upload“,支援直接拖曳多個檔案到瀏覽器視窗上傳,在它的server/php資料夾,也包含上傳與影像處理的PHP程式碼,提供你參考。

      thanks,
      jeffrey

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *