2011-03-13 129 views
2

這個問題可能很愚蠢,但我真的不知道如何解決它: 唯恐在我的應用程序中說,我有一個用戶。此用戶編輯他的個人資料,並需要編輯他的頭像。在Java Web應用程序中,我應該在哪裏存儲用戶照片?

我應該在哪裏存儲頭像文件? 首先,我將所有文件保存在src \ main \ webapp \ resources中,但是每次我重新部署該文件夾時清空。

所以我dedide放置在其他位置:c:\ wwwdir \ resources,but i can't link local resources from remote pages,所以我無法顯示任何頭像。

有什麼想法嗎?建議?鏈接?

回答

7

觀光來到了一個解決方案之前考慮:

  • 你會來水平擴展你的web應用(即你會運行多個servlet容器實例)。
  • 你期待什麼樣的流量?
  • 圖片需要更新多快(即用戶更改其頭像後,他們和所有其他用戶是否應立即看到新頭像)。

對於未水平縮放的web應用程序,可以使用文件系統作爲圖像存儲。這很簡單,可以理解,而且有效。

對於橫向縮放的web應用程序,您需要將圖像存儲在每個servlet容器可以到達的位置。這可能是一個數據庫(我不推薦這麼做),S3(我推薦這個)或者一個內容倉庫(我從來沒有使用過其中的一個)。 S3的一個優勢是它的規模很好。您可以將它放在CloudFront(亞馬遜的CDN)之後,或者直接從S3服務器中卸載,並保持服務器的負載不變。

你也提到你的問題,你不能從遠程客戶端服務器本地資源。這是正確的,有點......我猜你正在嘗試使用一些URL,如file://c:/.../image.jpg。這不起作用。你需要做的是映射一個處理程序來提供圖像。這可能看起來像

@RequestMapping(value = "/image/{name}.jpg", method = RequestMethod.GET) 
public void image(@PathVariable("name") String name, HttpServletResponse response) { 
    // Read the image from the file system using java.io 
    // Write the image to the response output stream 
    // Even better use org.springframework.utils.FileCopyUtils 
} 
0

嘗試像露天或兔崽子

一個Java內容倉庫
+0

我檢查了Jackrabbit,它看起來非常複雜,實現時間很長,找不到任何教程解釋如何實現它與彈簧3 – 2011-03-14 13:25:26

+0

[在jackrabbit網站](http://jackrabbit.apache.org/jcr-client -application-howto.html)你有這3行代碼片段。這並沒有比這更容易。 – eddie 2011-04-08 19:21:44

3

如何創建一個servlet讀取無論你已經保存在您的本地資源,只是流回來爲適當的內容類型?所以,而不是<img src="/resources/xyz.jpg"/>你會有類似<img src="/resourceservlet?id=xyz.jpg"/>。因此,您可以根據需要將文件存儲在C:\ wwwdir \ resources文件夾中。

在網上搜索「java image servlet」會給你一些鏈接,告訴你如何做到這一點。您可以使用其中一個custom servlets或者如另一個響應中提到的那樣使用框架的功能(例如Spring)進行構建。

您也可以考慮將這些圖形存儲在Amazon S3中,但我不知道您正在構建的東西的規模。使用這個servlet可以讓你移動內容而不必重做你的頁面鏈接。

+0

你能告訴我更多關於這個解決方案嗎?任何鏈接? – 2011-03-14 01:02:22

+0

@Stunaz編輯答案爲您提供了一個適當示例的鏈接。 – 2011-03-14 13:31:10

0

如何平原舊MySQL

替身的另一種選擇是使用gravatar.com(或類似的東西)。這種方法比保留頭像更爲現代和有效。

+0

thas是一個例子,如果用戶有一張專輯照片? – 2011-03-14 13:14:43

相關問題