在 Play 2.1 应用程序中,存储私有资产的合适位置在哪里?
“私有资产”是指应用程序使用但用户无法访问的数据文件。
例如,如果我有一个文本文件 ( Foo.json
),其中包含每次应用程序启动时都会解析的示例数据,那么项目中存储它的正确目录是什么?
Foo.json
需要包含在部署中,并且需要在开发和生产中都可以从代码中统一访问。
在 Play 2.1 应用程序中,存储私有资产的合适位置在哪里?
“私有资产”是指应用程序使用但用户无法访问的数据文件。
例如,如果我有一个文本文件 ( Foo.json
),其中包含每次应用程序启动时都会解析的示例数据,那么项目中存储它的正确目录是什么?
Foo.json
需要包含在部署中,并且需要在开发和生产中都可以从代码中统一访问。
一些选项:
conf
文件夹。IE:conf/privatefiles/Foo.json
application.conf
路径添加到文件系统中某个位置的外部文件夹(完整路径),在这种情况下,您无需重新部署应用程序即可轻松编辑内容:/home/scrapdog/privatefiles/Foo.json
在所有情况下,请考虑使用内存缓存来避免每次需要时从文件系统/数据库中读取它。
You can do what I did, I got the answer from @Marius Soutier here. Please upvote his answer there if you like it:
You can put "internal" documents in the conf
folder, it's the equivalent to resources
in standard sbt projects.
Basically create a dir under conf
called json
and to access it, you'd use Play.resourceAsStream()
. Note that this gives you a java.io.InputStream
because your file will be part of the JAR created by activator dist
.
My example is using it in a view but you can modify it as you want.
Play.resourceAsStream("json/Foo.json") map { inputStream =>
Ok(views.html.xxx(XXX.do_something_with_stream(inputStream)))
} getOrElse (InternalServerError)
You can also use Play.resource()
, this will give you a java.net.URL
, you can use getFile()
to get the java.io.File
out of it.
Play.resource("json/Foo.json") map { fileURL =>
Ok(views.html.xxx(XXX.do_something_with_file(fileURL.getFile())))
} getOrElse (InternalServerError)
我只是使用data
在应用程序根目录中调用的文件夹。您可以使用您想要的名称或更好的名称,将实际名称存储在配置文件中。
要解析其路径,我使用以下代码段:
lazy val rootPath = {
import play.api.Play.current
play.api.Play.application.path.getPath
}
lazy val dataPath = rootPath + "/data/"