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