:::
11-2 安全檔名
- 在windows下,上傳中文檔名後,讀出可能會失敗,因此,可以將檔名轉成英文、數字的組合。
- 可用內建的phpinfo()來取得副檔名的方法:
$ext = pathinfo($filename, PATHINFO_EXTENSION); - 檔名其實可以用0.jpg、1.jpg...用索引這樣依序命名,但是日後修改時,若要再補上傳檔案,其實會蠻麻煩的,因為還要想辦法抓取目前檔名最大值。我們可以給予檔名一個前置字串,但必須每次上傳時都不一樣,因此,可以用date()日期來做。也就是當2021年01月17日08:30:15上傳時變成 20210117083015-0.jpg、20210117083015-1.jpg 類似這樣的檔名,修改時再重傳,檔名就不會重複而被覆蓋。
- 將檔名部份改一下即可:
// 依序讀出檔案 foreach ($_FILES['files']['name'] as $i => $filename) { // 若沒檔案就中斷 if (!$filename) { break; } // 檢查檔案是否上傳成功 if ($_FILES['files']['error'][$i] === UPLOAD_ERR_OK) { // 讓檔案放在文章編號的目錄下,比較方便管理,檢查有無該目錄 if (!is_dir(_PATH . "/uploads/{$id}")) { // 若無建立原檔目錄 mkdir(_PATH . "/uploads/{$id}"); // 順便建立縮圖目錄 mkdir(_PATH . "/uploads/{$id}/thumbs"); } // 暫存檔來源 $file = $_FILES['files']['tmp_name'][$i]; // 副檔名 $ext = pathinfo($filename, PATHINFO_EXTENSION); // 圖片的前置字串 $prefix = date('YmdHis'); // 原圖欲放置到哪裡 $dest = _PATH . "/uploads/{$id}/{$prefix}-{$i}.{$ext}"; // 將檔案移至指定位置 if (!move_uploaded_file($file, $dest)) { die("無法將檔案{$file}上傳至指定位置{$dest}"); } } else { die("上傳錯誤:{$_FILES['files']['error'][$i]}"); } } - 以剛剛相同的例子來說,上傳後的檔名會變成這樣:

11-1 多檔上傳