0

私は Grails フレームワークを使用していくつかのテストを行ってきましたが、今は playframework で同様のことをしようとしています。

基本的に、いくつかの写真を表示したいのですが、(クロールを回避し、ホスティングを変更できるようにするために) 写真のパスを非表示にします。

gsp ページ:

<g:each in="${images}"  var="img">
        <img class="thumbnail" src='${createLink(controller: "images", action: "displayImage", params:[img: img.name])}'/>
</g:each>

コントローラー:

def displayImage() {
        File image = new File(IMAGES_DIR.absolutePath +'/' + params.img)
        if(!image.exists()) {
            response.status = 404
        } else {
            response.setContentType("application/jpg")
            OutputStream out = response.getOutputStream();
            out.write(image.bytes);
            out.close();
        }
}

HTML で生成されたページは次のようになります。

<img class="thumbnail" src='/myhost/images/displayImage?img=blabla.jpg' />

私の質問:

  • これは最善の方法ですか?

  • 性能については?

  • これは、 http を使用して写真を表示するよりも遅いですか?

  • Playframework でこのようなことはできますか? はいの場合、どのように?

ありがとう。

CC

4

1 に答える 1

2

静的リソースと公開リソースの場合、ほとんどの場合、生の HTTP サーバーを使用するのが最速のソリューションになるため、Java コントローラーを介して「ドラッグ」する必要はないと思います。実際には Play でも非常によく似ていますが、さらに簡単に実行できます。Play ではFilea をレスポンスボディとして直接返すことができるためです (頭のてっぺんから書きました):

public static Result displayImage(String imagePath) {
    File image = new File(SOME_CONFIGURED_FOLDER_WITH_IMAGES +'/' + imagePath)
    if(!image.exists()) return notFound();
    return ok(image).as("image/jpg");
}

とにかく、次の場合にのみ使用してください。

  • 追加の HTTP サーバーを使用するつもりはありません (Play には HTTP サーバーが組み込まれていることを覚えていますか? )
  • アクセス制御を行う必要があります
  • いくつかの操作を実行したい。スケーリング、トリミングなど (そのような場合、サムネイルの作成にのみ Play を使用し、一般的な HTTP サーバーで提供することもお勧めします...)

このアプローチに感謝します:

  • HTTP サーバーはディスクに保存されているファイルを提供するだけで済み、Result.
  • アプリは他の動的操作に集中できるため、高速になります。
  • cookie free domains、高度ななどの静的コンテンツの提供を最適化するために、典型的なウェブマスターの手法を使用できます(また、使用する必要がcaching headersあります)(Playコントローラー内でも実行できますが...)
于 2013-04-24T18:56:41.130 に答える