如何為應用程式加入檔案上傳:儲存空間、限制與安全
要為應用程式加入檔案上傳,請把檔案存放在物件儲存空間(儲存桶)中,而不是伺服器磁碟或資料庫內;並在資料庫中儲存一筆小紀錄,包括檔案的鍵、名稱、大小、類型和擁有者。請在伺服器端檢查檔案大小和類型;事先決定檔案是公開(例如產品相片)還是私人(例如發票);並且只有在確認查詢者的身分之後,才提供私人檔案。在 AI 應用程式生成工具中,一句提示詞便可描述上傳功能;重要的是測試檔案在重新部署後是否仍然存在,以及錯誤的人是否無法開啟它們。
先決定你需要哪種上傳
建造之前,先回答三個問題:
- **什麼檔案?**個人頭像、產品圖片、PDF、試算表、音訊、影片。這決定了類型與大小限制。
- **誰可以查看?**所有人(公開的相簿),還是只有上傳者和管理員(合約、身分證明文件、客戶檔案)。
- **上傳之後會怎樣?**只是儲存、顯示預覽、調整圖片大小,還是讀取內容。
公開圖片與私人文件需要不同的設定,因此要先確定這一點。
檔案應存放在哪裡
| 選擇 | 運作方式 | 適合 | 須留意 |
|---|---|---|---|
| 物件儲存空間(儲存桶) | 檔案存放在專為此而設的服務中;你的資料庫保存鍵或 URL | 幾乎所有應用程式 | 必須正確設定存取規則 |
| 平台提供的儲存空間 | 你的 AI 生成工具或主機為你啟用一個儲存桶 | 建立於該平台之上的應用程式 | 限制和收費跟隨該平台 |
| 伺服器磁碟 | 檔案寫入應用程式伺服器的檔案系統 | 只適合本地開發 | 重新啟動或重新部署後常會被清除 |
| 資料庫之內 | 檔案的位元組存放在資料表中 | 幾乎從不適用 | 令資料庫膨脹,拖慢備份 |
| 第三方上傳元件 | 由託管的上傳服務處理整個流程 | 大型媒體、圖片轉換 | 另一個供應商、另一個帳戶、另一張帳單 |
對大多數應用程式來說,物件儲存空間加上一筆資料庫紀錄,是正確的做法。資料庫的那一列是你的應用程式查詢的對象(「顯示此用戶的文件」);儲存桶只負責存放檔案的位元組。
公開檔案與私人檔案
- 公開檔案(產品照片、部落格圖片、頭像)可以透過公開 URL 提供。任何擁有連結的人都能開啟,這對此類內容來說沒有問題。
- 私人檔案(發票、合約、醫療或身分證明文件、交付予客戶的成果)絕不可以有容易猜中的公開 URL。伺服器會先檢查已登入的用戶是否擁有該檔案或有權查看,然後再把檔案串流回傳,或回傳一個簽署 URL(只在短時間內有效的連結)。
一個常見而嚴重的錯誤,是把私人檔案存放在公開儲存桶中,並使用可預測的檔案名稱。任何人只要猜到 /uploads/invoice-102.pdf,就能看到別人的發票。
例子提示詞
公開圖片上傳:
讓管理員為每件產品上傳最多 5 張產品相片。每張接受 JPG、PNG 和 WebP,大小上限為 5 MB。把檔案存放在檔案儲存空間,並把每個檔案的鍵、大小和排序儲存到 product_images 資料表,顯示縮圖及移除按鈕。在伺服器端驗證類型和大小,而不只是在瀏覽器中驗證。
私人文件上傳:
為已登入的客戶加入「文件」頁面。客戶可以上傳最大 20 MB 的 PDF。檔案是私人的:把它們存放在檔案儲存空間,並把擁有者 ID、原始檔名、大小和上傳時間儲存到 documents 資料表。只允許擁有者和管理員下載。下載必須經過一個伺服器路由,並在該路由中檢查權限。切勿為這些檔案提供公開 URL。
後續的實用要求:
上傳期間顯示進度列;如果檔案太大或類型錯誤,顯示清楚的錯誤訊息。
當文件資料列被刪除時,同時刪除已儲存的檔案。
逐步進行
- **為每個上傳欄位定下類型與大小限制。**要具體:「最大 20 MB 的 PDF」,而不是「文件」。
- **啟用儲存空間。**在 AI 生成工具中,要求上傳功能,它便會替你設定儲存空間;其他平台則需要建立儲存桶,並把其憑證作為伺服器端機密加入。
- 建立一張資料表儲存檔案紀錄:ID、擁有者、儲存鍵、原始名稱、類型、大小、建立時間。
- 在伺服器端建立上傳路由:檢查用戶是否已登入,檢查類型和大小,生成安全的儲存鍵(不要使用用戶提供的檔名),儲存檔案,然後插入紀錄。
- 建立下載或顯示的路徑:公開檔案使用公開 URL;私人檔案則使用經過權限檢查的路由或簽署 URL。
- 建立介面:檔案選擇器、如有需要可加入拖放功能、進度、預覽和錯誤訊息。
- 處理刪除,確保移除一筆紀錄時,也會移除已儲存的檔案。
- 測試:上傳、重新載入、重新部署或發布,然後確認檔案仍能載入。接着以另一位用戶登入,嘗試開啟第一位用戶的私人檔案。
常見錯誤
- **把上傳的檔案寫入伺服器磁碟。**在開發環境中運作正常,但重新啟動或重新部署後檔案就會消失。
- **信任瀏覽器的檢查。**檔案輸入欄位的「accept」設定只是提示,不是保安措施。請在伺服器端檢查類型和大小。
- **以用戶的檔名作為儲存鍵。**名稱可能重複,也可能包含奇怪的字元。請生成獨一無二的鍵,並另外儲存原始名稱。
- **把私人檔案放在公開儲存桶中。**見上文;這是最常見、最容易成為新聞的漏洞。
- **允許任何檔案類型。**在某些設定中,從你的網域提供的 HTML 或 SVG 檔案可能會執行腳本。只接受你需要的類型。
- **沒有大小限制。**一個巨大的上傳可能耗盡你的儲存配額,或令請求逾時。
- **孤立的檔案。**刪除了資料庫的資料列,卻沒有刪除檔案,會慢慢填滿你要付費的儲存空間。
- **忘記手機。**手機相片可能很大,而且格式可能是 HEIC;請決定要接受還是轉換。
檢查清單
- 檔案存放在物件儲存空間,而不是伺服器磁碟或資料庫中
- 每個檔案都有資料庫紀錄,包括擁有者、鍵、名稱、類型和大小
- 類型和大小在伺服器端檢查
- 儲存鍵由系統生成,而不是取自檔名
- 私人檔案只會在通過權限檢查之後才提供
- 其他用戶即使有連結也無法開啟你的私人檔案
- 刪除紀錄時也會刪除檔案
- 發布或重新部署之後,檔案仍能載入
- 上傳錯誤會清楚顯示,包括在手機上
在 Mythex 上傳檔案
當應用程式需要上傳功能時,Mythex 可以為專案自動啟用檔案儲存空間,因此你無須手動設定儲存桶。你也可以在對話中輸入 /storage。它在免費及 Pro 方案均可使用,免費方案的上限為 1 GB;你可以在 Settings → Storage 查看其狀態。
文件明確指出,已發布的託管環境並不是可持久使用的本地檔案系統,因此請要求代理使用平台的儲存空間,而不是把檔案存到磁碟。儲存的檔案及下載會從你的點數餘額扣除,按大小及下載次數計算;Pro 方案的收費為免費方案的一半。詳見文件中的檔案儲存空間。
上傳功能通常與資料庫(儲存檔案紀錄)及登入(保護私人檔案)一同使用。如果你正在建立一個讓客戶交換文件的平台,請參閱如何建立客戶入口網站,並在正式推出前檢視安全檢查清單。
常見問題
上傳的檔案應存放在哪裡?
應存放在物件儲存空間(一種專為檔案而設的服務,通常稱為儲存桶),而不是應用程式伺服器的磁碟,也不是資料庫之內。你的資料庫只需保存檔案的鍵或 URL,以及名稱、大小和擁有者等詳細資料。
為什麼我發布或重新部署之後,上傳的檔案會消失?
大多數託管平台並不保留可持久使用的本地磁碟:應用程式重新啟動或重新部署時,寫入其磁碟的檔案都會遺失。請改為把上傳的檔案儲存到物件儲存空間。
如何讓上傳的檔案保持私密?
不要讓檔案可被公開讀取。由伺服器檢查已登入的用戶是否有權查看該檔案,然後傳送檔案,或回傳一個短期有效的簽署連結。
Mythex 支援檔案上傳嗎?
支援。當應用程式需要上傳功能時,Mythex 可以為專案啟用檔案儲存,免費及 Pro 方案均可使用,免費方案的上限為 1 GB。你可以向代理要求上傳功能,或輸入 /storage。