在 Python 中,使用 secrets.token_hex() 產生隨機檔案名稱,將副檔名分開處理,並以獨佔模式(x)建立路徑,以免覆寫既有檔案。

隨機名稱適用於上傳、匯出、快取和測試資料,但隨機性只能解決命名問題。路徑仍需使用受控的目錄,副檔名應經過刻意選擇,而寫入作業必須在另一個程序已占用該名稱時安全地失敗。以下範例涵蓋永久名稱、暫存檔案,以及用於上傳測試的瀏覽器本機測試資料。

how to generate random file name in python
如何在 Python 中產生隨機檔案名稱

選擇合適的隨機來源

當名稱可能暴露於使用者或攻擊者時,請使用密碼學隨機性。Python 的 secrets 模組是產生不可預測權杖最清楚的選擇。若同時需要標準識別碼格式,使用 UUID4 值會很方便。一般用途的 random 模組適合非敏感的範例標籤,但不適合作為無法猜測的上傳名稱之基礎。

請依需求選擇方法,而不是依程式碼量選擇:

方法 適用情境 重要限制
secrets.token_hex() 不可預測的上傳、匯出或快取名稱 傳回十六進位文字,因此必須另外加上核准的副檔名
uuid.uuid4().hex 受益於 UUID 格式的識別碼 仍需受控的路徑處理及避免碰撞的建立方式
random.choices() 非敏感的測試資料和範例 並非用來抵抗預測
tempfile.NamedTemporaryFile 具有受管路徑的真正暫存檔案 您必須決定何時移除並重新開啟檔案

沒有任何隨機名稱函式能保證檔案建立前路徑尚未使用。另一個程序可能會在產生名稱與開啟檔案之間占用該名稱,因此即使使用冗長的隨機權杖,避免碰撞的建立方式仍然很重要。

在 Python 中建立隨機檔案名稱

讓隨機部分與副檔名保持由程式碼控制。不要將未受限制的使用者文字插入路徑。簡短的固定前綴可用來描述記錄類型,而隨機權杖則可降低猜測與碰撞風險。

  1. 選擇能描述檔案的固定前綴,例如 upload、export 或 cache。
  2. 使用 secrets.token_hex() 或 uuid4().hex 產生不可預測的部分。
  3. 加上核准的副檔名,並將結果維持為受控目的目錄下的基本檔名。

最簡單的安全權杖模式如下:

  • 匯入:from secrets import token_hex
  • 權杖:token = token_hex(16)
  • 檔案名稱:filename = f"upload-{token}.bin"

這段程式會產生檔案名稱,但不會建立檔案。十六進位權杖不含路徑分隔符號,而後綴是固定的,因此隨機值無法變成目錄路徑。若需要可讀的識別碼,secrets.choice() 可以從核准的字母與數字清單中選取,但權杖仍應符合應用程式的碰撞與威脅模型。隨機名稱不是授權機制,不應用來決定使用者是否可以讀取檔案。

當 UUID 語意有用時,等效模式更簡單:

  • 匯入:from uuid import uuid4
  • 檔案名稱:filename = f"{uuid4().hex}.csv"

副檔名只是一個標籤。以 .csv 結尾的名稱不會讓檔案變成 CSV 資料,因此請寫入適當內容,或使用接收系統明確預期的副檔名。

寫入檔案而不覆寫資料

產生候選名稱並不會保留該名稱。請使用獨佔建立方式,並在路徑已存在時重試:

  1. 選取或建立預定的輸出目錄。
  2. 在迴圈中產生新的候選名稱。
  3. 以二進位獨佔模式 xb 開啟路徑。
  4. 捕捉 FileExistsError 並嘗試其他候選名稱;在服務中應使用有上限的重試次數。

必要的迴圈如下:

  • 匯入:from pathlib import Path; from secrets import token_hex
  • 目錄:output = Path("output")
  • 準備:output.mkdir(exist_ok=True)
  • 迴圈:while True:
  • 候選名稱:filename = f"upload-{token_hex(16)}.bin"
  • 路徑:path = output / filename
  • 建立:with path.open("xb") as file:
  • 寫入:file.write(b"test payload")
  • 成功:break
  • 碰撞:except FileExistsError: continue

xb 中的 x 表示獨佔建立。路徑存在時會失敗,而不會將它截斷;相較之下,模式 w 會覆寫既有位元組。當兩個工作程序同時產生名稱時,這點尤其重要。寫入字串時,請改以文字模式 x 開啟,並加入有限的重試上限,避免重複的檔案系統錯誤造成無限迴圈。

如果應用程式會接收使用者提供的檔案名稱或副檔名,請先驗證該部分,再將它與目錄結合。固定副檔名的核准清單通常比接受任意文字更安全。將基本檔名隨機化並不能防止副檔名技巧或不安全內容。

使用 Python 的暫存檔案輔助工具

當名稱的主要用途是識別暫存資源時,tempfile.NamedTemporaryFile 可省去手動建立權杖,並處理各平台特有的暫存檔案細節。

  • 匯入:from tempfile import NamedTemporaryFile
  • 建立:with NamedTemporaryFile(prefix="upload-", suffix=".bin", delete=False) as file:
  • 寫入:file.write(b"temporary test data")
  • 路徑:temporary_path = file.name

預設的刪除行為會在檔案關閉時將其移除。當內容管理員關閉控制代碼後,應用程式的其他部分必須重新開啟該路徑時,請設定 delete=False,然後在完成後明確移除。請將前綴和後綴作為引數傳入,不要在之後修改產生的路徑。當一組暫存檔案必須共用同一個清理位置時,請使用 TemporaryDirectory。

加入瀏覽器產生的上傳測試資料

進行上傳、儲存、傳輸或校驗和測試時,請將產生的識別碼與檔案內容分開處理。Dummy File Generator 會建立檔案內容:具有精確位元組數及明確內容政策的本機檔案。它不會產生 Python 檔案名稱,因此輸入名稱時,請使用 Python 程式產生的名稱。

  1. 輸入安全的檔案名稱,以及 1 到 52,428,800 之間精確的整數位元組大小。大小只能包含十進位數字,且不得有正負號、小數點、指數、逗號、單位後綴或前後空白。
  2. 選擇零位元組、安全隨機位元組或重複的 UTF-8 文字。文字模式須提供非空白模式,長度不超過 10,000 個 UTF-16 程式碼單位,且不得含未配對的 Unicode 代理項。
  3. 產生 Blob,確認顯示的精確位元組摘要與內容政策,然後下載本機測試檔案。
內容模式 建立內容 可重現性與邊界行為
零位元組 只有位元組值 0x00 具決定性,而且通常能大幅壓縮
安全隨機位元組 來自瀏覽器 Web Crypto 的隨機資料 不會保留種子,因此之後無法重現相同的隨機檔案
重複的 UTF-8 文字 將編碼後的模式重複至接近要求的尺寸 會先使用完整字元,最後無法容納另一個字元的 1 至 3 個位元組則以 ASCII 空格填滿

安全隨機模式會呼叫瀏覽器的 Crypto.getRandomValues API,每次處理的區塊不超過 65,536 個位元組。它適合用於無法壓縮的測試資料和校驗和流程,但它不是密碼產生器、加密系統,也不能證明下載的位元組在分享後仍保持機密。

即使要求的尺寸落在多位元組字元中間,文字模式仍會保留有效的 UTF-8。ASCII、重音字母、CJK 字元和表情符號所占的位元組數並不相同,因此模式顯示的長度不等於編碼後的長度。

所有建立與下載作業都在目前的瀏覽器分頁中進行。產生的位元組、檔案名稱或文字模式不會上傳至 Lizely 或傳送至其他服務。該工具會加總各部分,並將最終的 Blob 大小與要求進行比對,不會四捨五入、截斷或取樣。回報的數字是邏輯位元組數;檔案系統和傳輸工具可能會壓縮連續的零或重複文字,因此實體磁碟用量及壓縮後的傳輸大小可能不同。

檔案名稱會經過驗證,而不是默默清理。該工具會拒絕空白名稱、前後空白、類似路徑的名稱、不安全分隔符號及仿冒字元、控制字元或不可見格式字元、尾端點號,以及 Windows 裝置名稱,例如 CON、NUL、COM1 和 LPT1。接受的名稱會原樣傳遞給下載作業,但瀏覽器可能會重新命名同名下載檔。關閉或編輯頁面會撤銷記憶體中的下載 URL,因此需要時請重新產生檔案。

副檔名不會建立真正的格式。以 .png 或 .pdf 結尾的名稱仍只包含零、隨機位元組或重複文字;它不會變成有效的影像、PDF、壓縮檔、可執行檔或媒體串流。

在名稱送入應用程式前進行驗證

使用產生的名稱前,請先套用一份簡短的應用程式層級檢查清單:

  • 讓隨機權杖與副檔名保持由受信任的程式碼控制。
  • 拒絕空白名稱、點路徑、正斜線或反斜線、控制字元和 Windows 裝置名稱。
  • 使用副檔名核准清單,並將上傳內容與檔案名稱分開驗證。
  • 將基本檔名與預定目錄結合,並以獨佔模式建立。
  • 在測試中繼資料中保留檔案名稱與預期位元組數,讓應用程式能夠斷言這兩項條件。

若要建立上傳測試資料,請在 Python 中產生檔案名稱,將同一個安全名稱輸入瀏覽器產生器,選擇符合測試需求的內容模式,並在下載前確認精確的位元組摘要。請讓測試資料保留於本機,且僅用於經授權的上傳、儲存或傳輸測試。對於會在產生後計算校驗和的流程,隨機位元組很合適;若測試資料本身必須可重現,則零位元組或重複文字更合適。