Play框架上公共文件夹外的资产映射

时间:2015-07-13 23:27:11

标签: playframework playframework-2.2

我们需要存储在外部路径中的大量图像列表。即在播放应用程序文件夹之外。

我们如何才能将其作为资产播放,以便将其作为网络服务器进行流式传输?

4 个答案:

答案 0 :(得分:6)

你可能已经看过Play的documentation about Assets了。除了Play的标准资产,您还可以定义自己的资产。

conf/routes中,您需要为外部资产添加一行:

# Static resources (not managed by the Play framework)
GET     /my_external_assets/*file         controllers.ExtAssets.at(file)
# Play's standard assets
GET     /assets/*file                     controllers.Assets.at(path = "/public", file)

然后你必须定义你的资产控制器。一个简单的例子如何完成:

public class ExtAssets extends Controller {

    public Result at(String filePath) {
        File file = new File(filePath);
        return ok(file, true);
    }
}

答案 1 :(得分:2)

为了完整性,我多次遇到过这个问题而且没有足够的答案。

通常nginx将面向外部世界reverse-proxy back into the application server。您不希望直接从Play提供文件,特别是如果您自己构建可能存在安全风险的路径。让专家处理静态文件,即nginx。

分发ZIP包[1]内的

Play Framework supports sbt-native-packager的"dist" directory which will attach any files。以下是文档:

dist    → Arbitrary files to be included in your projects distribution

对于controlled downloads等用例使用nginx's X-Accel,通过响应标头告诉nginx将哪个文件发送回客户端。

TLDR:使用nginx制作它的内容,使用Play制作它的内容。

答案 2 :(得分:0)

一个hacky解决方案是在你的sbt play公共文件夹中包含一个符号链接到你想要加载文件的位置。符号链接将打包在程序集中,并在运行时运行。

cd ~/your/playframework/awesome/project/public
ln -s '/var/lib/funky-data-set-for-my-awesome-project/' funky-data

现在你可以在你的路线文件中使用:

GET         /funky/assets/*file                controllers.Assets.at(path="/public/funky-data", file)

这样做的缺点是你的stage / dev / prod环境必须在同一个位置拥有你需要的内容。

答案 3 :(得分:0)

播放2.5

file:routes

- task: create-rpm
  image: oregano-test-fedora
  config:
    platform: linux
    inputs:
    - name: git-clone-resource
    outputs:
    - name: srpm

file:ImagesController

GET  /external_resources/*file controllers.ImagesController.getImage(path="/home/project_name/external/images", file: String)