使用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:

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 />";
          }
       }
     }
  }
}
?>

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

Posts created 467

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

  1. 請問上傳成功後要如何將這些路徑全部傳到書本(10-10)的地方 顯示

    再個別存入資料庫~謝謝

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

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

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

  4. 若要存入同一個欄位,可以將圖檔位址包在HTML的 img 標籤裡面,這樣就能讓它們一齊顯示在網頁上了。

  5. 雖然不認識你
    但謝謝你~
    無意間在網路上搜尋到這篇文章
    對我很有幫助^^

  6. 很棒的書喔….一直到今日都還在向朋友推薦這本書!!
    加油喔~~期待您下一本鉅著!!:lol:

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

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

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

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

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

    是這樣嗎??

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

  11. 請問老師
    如果是要像奇摩部落格那樣
    全選整批上傳
    而不是像你這範例一個一個選100次
    要怎麼做????

  12. hi 佳佳:

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

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

    have fun!
    jeffrey

  13. 版主你好, 想請教

    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

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

  15. 你好!請問如果一次傳多個檔案…..可以檢查嗎??….php初學者……謝謝!

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

    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

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

    1. hi thunder:

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

      thanks,
      jeffrey

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top