2014-01-18 60 views
3

這實際上更像是一種「使用什麼方法」而不是「如何做」的問題。我正在使用Express在NodeJS中創建一個站點。因此,每個用戶都有能力上傳profile picture,我的擔心是如何爲這些圖像發送請求。我有幾個問題是:如何在節點中提供靜態配置文件圖像

  • 如果未指定有效的文件,我可以使用express.static()來提供默認文件嗎?如果沒有,我需要爲/img/profile指定GET路由並處理FS查詢嗎?

  • 如果允許多個文件擴展名,我怎麼才能找到正確的圖像? (我最初只是刪除了文件擴展名,並且它們出現在img標籤中,是嗎?)

  • 我目前命名所有圖片都是用戶名後面的。展望未來(對於可能需要擴展的應用程序),靜態用戶內容的常規命名約定是什麼?大部分存儲在引用數據庫內容的UUID中?

  • 還有什麼我應該考慮的,我可能還沒有考慮過呢?

回答

3

第一個問題:

目前,我建議你存儲,可以從列或字段的組合在數據庫中的條目來推斷預測的位置,你的圖像。其中一個字段或列將是一個文件名(佔不同的擴展名)。然後,如果他們沒有上傳圖片,則只需在視圖代碼中放置一個對通用「未設置圖片」文件的引用即可。

express.static明顯可以服務器靜態文件,但它目前沒有辦法滿足一些其他的文件,如果你愛的人是不存在的。因爲這聽上去很不錯,我做了一些修改,以static支持你的要求是什麼,並提交了幾個拉請求(地物觸及2個不同的模塊):

我不知道如果這些將獲得包含在項目中,但如果你想看到我的叉子有這些變化,他們在這裏:

如果這個經歷,你將登上一個靜態的,在您的個人資料的圖像文件的根目錄:

app.use(static('<profile image files root>', { fallback: 'anon.jpg'}))

第二個問題

我一般將擴展存儲在我的數據庫中,然後在加載圖像時,我有正確的擴展名放入img標記的src屬性中。

第三個問題

如果你能保證唯一的名稱,然後使用這些會工作。我建議使用DB ID或UUID。掃描所有圖像上傳時,它不那麼直觀,但我很少發現自己在這樣做。我通常尋找一個特定的圖像,我可以根據需要查找標識符。

四問題

你可能最終存儲(例如,在S3)你的應用服務器以外的靜態內容。如果發生這種情況,當然static不會幫助你。

+1

我已經感覺更接近正確的道路。感謝真棒信息! – Kyle

+0

很高興幫助。而FWIW,項目維護人員不同意我的方法並拒絕PR。 :)他們是聰明的人,所以它可能值得考慮他們的評論。快樂的編碼! – juanpaco