2014-11-09 99 views
1

我正在構建託管在Elastic Beanstalk上的Spring Web應用程序。我使用S3來存儲用戶上傳的圖像,效果很好。我不明白的是如何從S3中獲取圖像到客戶端工作。我找到了三種選擇。Spring應用程序 - 將Amazon S3上的圖像發送到客戶端

1.將圖像存入控制器併發送給客戶端。像這樣:

S3Object object = amazonS3Client.getObject("bucketname", "path/to/image"); 

2.打開所有圖像並直接通過客戶端的URL訪問它。類似這樣的:

<img src="http://aws.amazon.com/bucket/path/to/image.jpg"> 

3.使用簽名的下載URL只能工作一段時間。像這樣:

GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest("bucketname", "path/to/image"); 
String url = conn.generatePresignedUrl(request) 

林不知道哪種方法去。通過Web服務器進行路由看起來沒有必要,因爲它會加載服務器。由於任何人都可以使用這些圖像,因此可以向任何人提供更高的請求和費用。第三種方法對我來說是新的,如果這真的是一種方法,我還沒有真正見過任何人這樣做,這讓我感到不安。

那麼,這通常如何完成?

這是如何在開發環境和生產環境中使用的。我猜它不會改變?或者在開發時只使用S3彈簧配置文件來更改靜態內容的位置,並且只用於生產?

如果您在S3上託管Javascript,CSS,那麼最常用的方法2是爲每個人打開它們?

回答

5

對我而言,這取決於您對用戶上傳的圖像進行訪問控制的要求。

如果圖像是不敏感的,即它不會真的重要,如果別人得到其他用戶的圖像的保持,那麼我會去的辦法2.

如果在另一方面也將是一場災難如果有人設法獲得另一個用戶的圖像,那麼我會採取方法3(或其他形式的到期令牌訪問圖像)。

我最後一次這樣做,我去了方法2,因爲圖像是不敏感的。爲了防止人們發現圖像,我們對圖像的名稱應用了哈希函數,但是我並沒有大量關注這個。無論哪種情況,在構建圖像的URL時,應用程序都可以輕鬆制定出明確定義的存儲桶結構,這很有用。所以對你來說,也許是考慮這樣的:

  • S3:BUCKET_NAME /圖片/用戶/ <hashed_and_salted_user_name>/<user_images>

至於你要求有關開發VS督促環境,再選配一個水桶名字到Spring profile是我們使用的方法。因此,例如:

  1. S3:BUCKET_NAME /生產/圖片/用戶/用戶/ foo.jpg
  2. S3:BUCKET_NAME的/ dev /圖片/用戶/用戶/ foo中。jpg

正如你大概猜測我們有春季配置文件命名爲「prod」和「dev」。創建圖像URL的代碼在創建URL時考慮了當前Spring配置文件的名稱。給環境提供了一個很好的分離。

就CSS和Javascript而言,我傾向於在生產S3存儲桶中託管混淆/縮小版本,並且在dev/test存儲桶中主要用於性能,而不是試圖隱藏代碼。另外,我將在S3中託管CSS/Javascript的方式使用某種版本/命名結構,以便確定應用程序使用的資源的「版本」。因此,例如:

  • S3:BUCKET_NAME/CSS/APP-1.CSS
  • S3:BUCKET_NAME/CSS/APP-2.css

的CSS/JavaScript資源的版本每次將新版本投入生產時都會更新。

通過沿着這條路走下去,你可以看到S3作爲一段Javascript/CSS的最終安息點,當它準備進入廣闊的生產世界時。一旦那裏,你知道它永遠不會改變。如果CSS/Javascript確實發生了變化,那麼用戶必須從S3中獲取新的資源,因爲版本將會增加。您可以將其鏈接到構建過程中,以便您的主應用始終引用最新版本的CSS/Javascript。我發現這樣做有兩個有用的功能:

  1. 使得它很容易確定資源的哪個版本的應用程序與
  2. 使得它很容易的緩存資源(無論是用瀏覽器或類似的東西CloudFront的)作爲運行你知道他們永遠不會改變

希望有幫助。

+0

很好的答案謝謝!由於它的非敏感圖像(它的化身),我會去做方法2。你是否將每個圖像url保存到數據庫?由於我不知道圖像擴展名,我想將它保存到數據庫中的每個用戶實體。我的網址如下所示: s3-eu-west-1.amazonaws.com/BUCKETNAME/images/avatars/USERID-avatar.EXTENSION – nilsi 2014-11-09 15:32:29

+0

通常我會盡量避免保存URL,因爲您會遇到不可避免的情況下,URL將會改變,然後你必須更新數據庫。最好能夠生成給定特定用戶的URL。在圖片擴展方面,我會提供兩種選擇,1:強制用戶只上傳特定的擴展名,或者如果不可行,2:將配置文件圖像擴展名存儲在數據庫中(如您所建議的那樣) 。 – 2014-11-09 15:50:54

+0

好的,非常感謝。然後我將保存擴展名。 – nilsi 2014-11-09 15:55:14

相關問題