:::

11-2 安全檔名

  1. 在windows下,上傳中文檔名後,讀出可能會失敗,因此,可以將檔名轉成英文、數字的組合。
  2. 可用內建的phpinfo()來取得副檔名的方法:
    $ext = pathinfo($filename, PATHINFO_EXTENSION);

     

  3. 檔名其實可以用0.jpg、1.jpg...用索引這樣依序命名,但是日後修改時,若要再補上傳檔案,其實會蠻麻煩的,因為還要想辦法抓取目前檔名最大值。我們可以給予檔名一個前置字串,但必須每次上傳時都不一樣,因此,可以用date()日期來做。也就是當2021年01月17日08:30:15上傳時變成 20210117083015-0.jpg、20210117083015-1.jpg 類似這樣的檔名,修改時再重傳,檔名就不會重複而被覆蓋。
  4. 將檔名部份改一下即可:
    // 依序讀出檔案
    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]}");
        }
    }

     

  5. 以剛剛相同的例子來說,上傳後的檔名會變成這樣:

:::

書籍目錄

展開 | 闔起

http%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbsn%3D52%26tbdsn%3D1817

計數器

今天: 1756175617561756
昨天: 4745474547454745
總計: 7711717771171777117177711717771171777117177711717