我们需要存储在外部路径中的大量图像列表。即在播放应用程序文件夹之外。
我们如何才能将其作为资产播放,以便将其作为网络服务器进行流式传输?
答案 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)