2014-01-19 71 views
3

我遇到了顯示從外部存儲中檢索到的圖像的實際問題,在這種情況下,S3可能很容易成爲數據庫。Play Framework 2顯示來自數據庫或外部資源的圖像

我的問題是如何顯示不在文件系統上的圖像,即它們是對象中的文件/圖像。我使用的播放2.1.1

查看

@for(image <- receipt.imageIds){ 
     <h4>@image.getId</h4> 
     <h3><img src="@controllers.Application.getImage(image.getId)" /></h3> 
    } 

路線

GET   /receipt/image/:id  controllers.Application.getImage(id:String) 

控制器(我試圖在這裏許多選擇,但,這是一個在別人看來使用)

public static Result getImage(final String id) { 
try { 
    ImageId image = AWS_S3_SERVICE.getImage(id); 
    return ok(extractBytes(image.getImage())).as("image/jpeg"); 
} catch (Exception ex) { 
    ex.printStackTrace(); 
} 
return ok(); 

}

如果我查看生成的輸出未顯示此圖像是我看到:

<img src="SimpleResult(200, Map(Content-Type -&gt; image/jpeg))"> 

回答

1

你花年齡試圖解決一個問題,問一個問題,然後解決它幾分鐘後來。

我做了兩個改變,一個是路由,另一個是控制器。

路線

<h3><img src="@controllers.Application.getImage(image.getId)" /></h3> 
changed to 
<h3><img src="@routes.Application.getImage(image.getId)" /></h3> 

控制器

public static Result getImage(final String id) { 
     try { 
     ImageId imageId = AWS_S3_SERVICE.getImage(id); 
     BufferedImage image = ImageIO.read(imageId.image); 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ImageIO.write(image, "jpg", baos); 

     return ok(baos.toByteArray()).as("image/jpg"); 
     } catch (Exception ex) { 
     ex.printStackTrace(); 
     } 
     return ok(); 
    } 
2

,因爲你需要從存儲文件傳送到應用程序,然後將其改寫爲輸出,最後發送到你是在浪費大量的自己的資源這樣的客戶端。這些操作中的每一個都會產生一些成本並且是多餘的

相反,你應該使用直接鏈接src屬性文件,並且還考慮緩存鬥對本地數據庫的文件列表,所以你不會需要問S3每次的路徑...

但也可能是像:

<img src="@utils.MyS3.getImagePath(image.getId)" /> 

getImagePath方法只返回字符串像http://s3.amazonaws.com/mybucket/myfile.jpg從ID的DB /緩存解決。

+0

感謝您的建議,我剛剛測試了圖像存儲策略,因爲我不想將它們存儲在數據庫中。我打算在AWS上運行應用程序,因此我認爲s3會更便宜。我會嘗試你的建議,但我也可以恢復在S3中備份或在Dynamo數據庫中存儲文件系統 –

相關問題