file
元件,其表單一定要加上 enctype="multipart/form-data
"file
欄位名稱為 media
(先將[]
及multiple
拿掉,也就是只上傳一個檔),如此送出後會產生一組 $_FILES
超級全域變數(二維陣列):
$_FILES['media']['name']
:上傳檔案原始名稱。$_FILES['media']['type']
:檔案的 MIME 類型,例如“image/gif”。$_FILES['media']['size']
:已上傳檔案的大小,單位為bytes。$_FILES['media']['tmp_name']
:檔案被上傳後的臨時檔案名。$_FILES['media']['error']
:和該檔案上傳相關的錯誤代碼。$_FILES['media']['tmp_name']
到指定的位置。
move_uploaded_file($_FILES['media']['tmp_name'], 新路徑檔名);
media
,多檔上傳的 name
屬性必須加上[]
及multiple
屬性,如:
<input type="file" name="media[]" id="files" class="form-control" placeholder="請上傳相片或影片"
accept=".jpg,.jpeg,.png,.gif,.mp4" multiple />
$_FILES
超級全域變數會變成像這樣(三維陣列):
$_FILES['media']['name'][0]
:第一個檔案原始名稱。$_FILES['media']['type'][0]
:第一個檔案的 MIME 類型,例如“image/gif”。$_FILES['media']['size'][0]
:第一個檔案的大小,單位為bytes。$_FILES['media']['tmp_name'][0]
:第一個檔案被上傳後的臨時檔案名。$_FILES['media']['error'][0]
:第一個檔案上傳相關的錯誤代碼。$_FILES['media']['name'][1]
:第二個檔案原始名稱。$_FILES['media']['type'][1]
:第二個檔案的 MIME 類型,例如“image/gif”。$_FILES['media']['size'][1]
:第二個檔案的大小,單位為bytes。$_FILES['media']['tmp_name'][1]
:第二個檔案被上傳後的臨時檔案名。$_FILES['media']['error'][1]
:第二個檔案上傳相關的錯誤代碼。id
編號來建立子目錄,例如 id=12
的文章,其目錄路徑就是 /uploads/12/
,這樣可以避免圖檔互相覆蓋,避免誤刪或者未來要刪除文章時也比較容易刪掉附檔。
// 取得插入的 id 值
$lastInsertId = $pdo->lastInsertId();
// 建立存放圖檔的目錄
$articleDir = $uploadDir . $lastInsertId . '/';
if (!file_exists($articleDir)) {
mkdir($articleDir, 0777, true);
}
其中 0777
是指任何人都可以寫入,而最後的 true
則是連同父目錄都一併建立
我們的上傳欄位為:
<input type="file" class="form-control" id="media" name="media[]" multiple accept=".png, .jpg, .gif, .mp4">
所以需要用 foreach()
迴圈來讀取 $_FILES['media']
,以便一個檔一個檔抽出來,用 move_uploaded_file() 完成上傳動作。上傳檔案的語法:
// 處理多檔案上傳
if (!empty($_FILES['media'])) {
$fileData = array();
foreach ($_FILES['media']['name'] as $index => $fileName) {
$fileTmpName = $_FILES['media']['tmp_name'][$index];
$fileDestination = $articleDir . $fileName;
// 將檔案移動到文章檔案目錄
move_uploaded_file($fileTmpName, $fileDestination);
// 將檔案路徑存入陣列
$fileData[$fileName] = $fileDestination;
}
// 將檔案相關資訊轉換為JSON格式
$media = json_encode($fileData, 256);
// 更新該文章的 media 欄位值
}
$fileData
就是用來儲存所有上傳的檔案陣列,$fileName
是檔名,用來作為 $fileData
的陣列索引;$fileDestination
則是檔案路徑,為陣列值。$fileData
資料用 json_encode() 編成JSON格式(加上 JSON_UNESCAPED_UNICODE
參數可以讓中文正確呈現,否則會用Unicode編碼,不過 JSON_UNESCAPED_UNICODE
太難記,所以可以直接輸入其對應值 256
就好),再寫進資料庫就OK囉!
// 將檔案相關資訊轉換為JSON格式
$media = json_encode($fileData, 256);