這裡介紹如何使用網頁與 PHP 上傳檔案,並提供單檔與多檔上傳的範例程式碼。
檔案上傳是網頁設計中常用的功能,若用 PHP 開發網站的話,可以使用其 $_FILES
變數來接收從網頁上傳的檔案,以下提供 $_FILES
變數的使用方法與範例程式碼。
建立一個上傳檔案用的 HTML 網頁,主要的內容如下:
<html><body> <form method="post" enctype="multipart/form-data" action="upload.php"> <input type="file" name="my_file"> <input type="submit" value="Upload"> </form> </body></html>
這個網頁表單包含了一個上傳檔案用的 <input>
(其 type
設定為 "file"
),再加上一個送出的按鈕。網頁表單中如果包含檔案的上傳,就要把 enctype
設定為 "multipart/form-data"
。
接著另外建立一個接收檔案用的 upload.php
指令稿,內容如下:
<?php # 檢查檔案是否上傳成功 if ($_FILES['my_file']['error'] === UPLOAD_ERR_OK){ echo '檔案名稱: ' . $_FILES['my_file']['name'] . '<br/>'; echo '檔案類型: ' . $_FILES['my_file']['type'] . '<br/>'; echo '檔案大小: ' . ($_FILES['my_file']['size'] / 1024) . ' KB<br/>'; echo '暫存名稱: ' . $_FILES['my_file']['tmp_name'] . '<br/>'; # 檢查檔案是否已經存在 if (file_exists('upload/' . $_FILES['my_file']['name'])){ echo '檔案已存在。<br/>'; } else { $file = $_FILES['my_file']['tmp_name']; $dest = 'upload/' . $_FILES['my_file']['name']; # 將檔案移至指定位置 move_uploaded_file($file, $dest); } } else { echo '錯誤代碼:' . $_FILES['my_file']['error'] . '<br/>'; } ?>
在這個 PHP 程式中,會先檢查 $_FILES['my_file']['error']
這個變數,確認檔案是否上傳成功,若成功的話其值會是 UPLOAD_ERR_OK
,若失敗的話就會是其他的值,各種錯誤的值請參考 PHP 的文件。
確認檔案有上傳成功之後,就可以透過 $_FILES
來取得檔案的各種資訊,這裡的 my_file
是檔案的名稱,要跟上傳網頁的 <input>
名稱對應。
檔案的內容在上傳之後,會先放置在一個暫存檔中,這個暫存檔的位置記錄在 $_FILES['my_file']['tmp_name']
變數中,這裡我們先檢查一下該檔案是否已經存在,若沒有重複上傳的話,就把上傳的檔案放進 upload
目錄中(這個目錄請自己建立,並開啟寫入權限)。
若要讓網頁可以一次上傳多個檔案,只要在 <input>
中加上 multiple
屬性,並將檔案名稱加上 []
:
<html><body> <form method="post" enctype="multipart/form-data" action="upload.php"> <input type="file" name="my_file[]" multiple> <input type="submit" value="Upload"> </form> </body></html>
建立接收檔案的 upload.php
指令稿,檔案的處理方式跟單一檔案的狀況差不多,只是上傳多檔案時,$_FILES['my_file']['name']
這類的變數都會變成陣列,取用時要多加上一個索引:
<?php # 取得上傳檔案數量 $fileCount = count($_FILES['my_file']['name']); for ($i = 0; $i < $fileCount; $i++) { # 檢查檔案是否上傳成功 if ($_FILES['my_file']['error'][$i] === UPLOAD_ERR_OK){ echo '檔案名稱: ' . $_FILES['my_file']['name'][$i] . '<br/>'; echo '檔案類型: ' . $_FILES['my_file']['type'][$i] . '<br/>'; echo '檔案大小: ' . ($_FILES['my_file']['size'][$i] / 1024) . ' KB<br/>'; echo '暫存名稱: ' . $_FILES['my_file']['tmp_name'][$i] . '<br/>'; # 檢查檔案是否已經存在 if (file_exists('upload/' . $_FILES['my_file']['name'][$i])){ echo '檔案已存在。<br/>'; } else { $file = $_FILES['my_file']['tmp_name'][$i]; $dest = 'upload/' . $_FILES['my_file']['name'][$i]; # 將檔案移至指定位置 move_uploaded_file($file, $dest); } } else { echo '錯誤代碼:' . $_FILES['my_file']['error'] . '<br/>'; } } ?>