2016-12-01 189 views
0

用戶通過按網頁上的按鈕在我的節點js服務器上生成文件。 服務器然後創建一個.zip文件。 我想公開這個zip文件,以便它可以自動下載到用戶的客戶端。 下載完成後,我希望服務器檢測到下載完成並刪除zip文件。生成可下載的文件鏈接並自動啓動下載

1-如何在節點js中公開文件?系統應該把它放在公共文件夾中嗎?這意味着這將是安全風險,任何人都可以閱讀它。我如何鏈接到一個文件&使它可下載不在公共文件夾中? 2-如何檢測下載是否完成?我應該運行一個cron作業來刪除這些文件而不必擔心下載過程嗎?

+1

你是如何生成zip文件的?你能不能簡單地迴應請求來生成壓縮文件*和* zip文件。如果你這樣做,保護zip文件並知道何時刪除它會簡單得多。 – idbehold

+0

我通過調用操作系統內置的zip命令行工具來生成zip文件。 –

回答

1

一個幾句話,應可幫助您:

  1. 如果要創建臨時文件,一個好的做法是創建簽署網址。這些是包含特定標記的URL,該標記在有限的時間內有效。實現很簡單 - 生成文件.zip和令牌,最好在數據庫中設置時間戳,並使用令牌構建帶符號的鏈接。如果文件未在給定的時間內被客戶端下載,則該文件無效。
  2. Zip文件應該有唯一的名稱,最好是一些隨機的名稱(如果這不是問題,您仍可以使用名爲Content-Disposition的標題在下載過程中決定其名稱)。您將它存儲在項目中的TEMP目錄中。
  3. 用戶點擊之前生成的帶有與該文件相關的令牌的已簽名鏈接後,即可開始下載(流式傳輸)。流式傳輸完成後(請參閱NodeJS流庫),您只需刪除該文件即可。

而且在客戶端:

  1. 您創建一個按鈕,導致端點在服務器上(觸發AJAX調用或其他)。點擊後,你在服務器上運行上面提到的邏輯。
  2. 作爲回報,用戶客戶端獲取生成的鏈接(領導到另一個端點處理這些只籤鏈接),必須遵循下載的文件
  3. 使用任何類型的DOM操作,您創建隱藏<a/>標籤與href導致這個鏈接,然後你觸發自動點擊JS鏈接中的這個鏈接。最好是,如果您支持新的瀏覽器,最好爲其添加download屬性。

請勿:

  • 將文件放在公用文件夾。創建將其內容流式傳輸到客戶端的端點。爲它創建一些臨時目錄。
  • 運行CRON作業以刪除文件。或者僅在出現問題時運行才能清理舊文件。下載後文件應該被刪除(你會知道,當你的流關閉時,你會得到一個適當的事件)。

實施意見

  1. 在服務器上創建兩個端點(使用Express或任何框架路由)。一個用於請求文件(啓動生成過程),另一個用於下載文件。
  2. 生成過程結束後,將.zip存儲在例如temp目錄併爲其創建標記。
  3. 存儲一組數據是這樣的數據庫對每次下載:
    • zip文件名
    • 令牌(如生成的隨機哈希)
    • 時間戳產生的
  4. 通過新鏈接到客戶端(用於下載過程的第二個端點)。客戶端會自動初始化下載沒有人際交往,上述
  5. 的建議當鏈接的代碼「點擊」,您的服務器接收的第二端點,然後另一個請求:
    • 檢查令牌仍然有效(例如30秒)。
    • 如果不是:403或404
    • 若是:開始流式傳輸的數據(創建文件流和流式傳輸到客戶端)
    • 流回時,包括具有響應,例如適當的標頭文件名客戶端應該看到(這將從temp目錄掩蓋你的內部文件名),使用Content-Disposition
  6. 流完成後,刪除文件
  7. 創建將如執行cron作業每天一次,向數據庫詢問所有具有無效令牌(過期的)的文件,並嘗試刪除它們(如果它們存在,但這不應該是一種常見的情況,如果在流式傳輸完成時將它們正確刪除) 。