在生产中的播放框架中从公共文件夹中读取文件

时间:2016-04-28 05:38:37

标签: playframework playframework-2.4

我的播放应用程序是2.4.2。 在开发人员模式中,我曾经使用Source.fromFile(“./ public / files / abc.json”)从后端控制器的公共文件夹中读取文件

当我将应用程序转换为生产模式时,我收到了File Not Found Exceptions。我发现公用文件夹在生产模式下打包在资产jar中。我能做什么才能在开发和生产模式下工作?

6 个答案:

答案 0 :(得分:4)

您是否试过这个Play文档https://www.playframework.com/documentation/2.5.x/AssetsOverview?这对Play 2.4来说很好,即使是2.3,我也试过了。

在那里你可以找到这个,你可以在conf / routes文件中执行此操作。

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

file - >是指文件名。 例如:myFile.json

要使其在生产模式下工作,您必须做更多的工作。如this回答中所述,将这些行添加到/build.sbt文件中。

import com.typesafe.sbt.packager.MappingsHelper._
    mappings in Universal ++= directory(baseDirectory.value / "public")

那将包括您的公众' dist文件中的目录(您可以包含任何类似的目录)。然后您的应用程序将在生产环境中工作。

答案 1 :(得分:2)

您可以使用此方法:

Play.application().getFile("/public/foobar.baz");

Method Doc

  

获取相对于应用程序根路径的文件。

答案 2 :(得分:0)

Play附带内置控制器来提供公共资产。

控制器在默认的Play JAR中可用作controls.Assets并定义一个具有两个参数的动作:

Assets.at(path:String,file:String) 必须修复path参数并定义该操作管理的目录。 file参数通常是从请求路径中动态提取的。

以下是conf / routes文件中Assets控制器的典型映射:

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

Refer here for more.

答案 3 :(得分:0)

有两种方法可以解决这个问题: - 1)直接使用Supun Wijerathne在上面的评论中提出的建议。 2)第二个是使用以下方法,如果一个人不想在应用程序的分发版本中添加额外的公共文件夹: -   a)从conf文件夹中的公用文件夹中复制所有文件。   b)使用Play的类加载器将资源作为流获取。   c)使用Source.fromInputStream方法将此输入流转换为bufferedsource。现在,控制器可以使用该文件进行处理。

答案 4 :(得分:0)

找到解决方案:需要使用assets /

调用这些资源

答案 5 :(得分:0)

如果使用的是Scala 2.12,请使用Source.fromResource而不是Source.fromFile。

示例:

如果将文件放在公用文件夹中,请不要使用斜杠。

Source.fromResource(“public/files/abc.txt”)

如果将文件放在conf文件夹中,请不要在路径中包含conf。

Source.fromResource(“files/abc.txt”)  // conf/files/abc.txt

如果您使用的是Scala <2.12,则可以使用Java。有两种方法。

相对路径(无斜杠)

scala.io.Source.fromInputStream(getClass.getClassLoader.getResourceAsStream(“public/test.txt”))

绝对路径(需要斜杠)

scala.io.Source.fromInputStream(getClass.getResourceAsStream(“/public/test.txt”))

我想如果将文件放在conf文件夹中,您还必须在路径中排除“ conf”。

最后,您可以在此blog中了解Java的资源加载方式。