4

在 Play 2.1 应用程序中,存储私有资产的合适位置在哪里?

“私有资产”是指应用程序使用但用户无法访问的数据文件。

例如,如果我有一个文本文件 ( Foo.json),其中包含每次应用程序启动时都会解析的示例数据,那么项目中存储它的正确目录是什么?

Foo.json需要包含在部署中,并且需要在开发和生产中都可以从代码中统一访问。

4

3 回答 3

3

一些选项:

  1. 通常文件进入conf文件夹。IE:conf/privatefiles/Foo.json
  2. 如果它们经常更改,您可以考虑将application.conf路径添加到文件系统中某个位置的外部文件夹(完整路径),在这种情况下,您无需重新部署应用程序即可轻松编辑内容:/home/scrapdog/privatefiles/Foo.json
  3. 您也可以将它们存储在数据库中,好处与以前的选项相同 - 易于编辑。

在所有情况下,请考虑使用内存缓存来避免每次需要时从文件系统/数据库中读取它。

于 2013-02-25T17:55:58.077 回答
1

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)
于 2014-10-07T04:39:19.157 回答
1

我只是使用data在应用程序根目录中调用的文件夹。您可以使用您想要的名称或更好的名称,将实际名称存储在配置文件中。

要解析其路径,我使用以下代码段:

  lazy val rootPath = {
    import play.api.Play.current
    play.api.Play.application.path.getPath
  }
  lazy val dataPath = rootPath + "/data/"
于 2013-02-25T19:03:35.760 回答