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]}");
}
}
- 以剛剛相同的例子來說,上傳後的檔名會變成這樣: