Playframework 在生产环境中从play framework中的公用文件夹读取文件

Playframework 在生产环境中从play framework中的公用文件夹读取文件,playframework,playframework-2.4,Playframework,Playframework 2.4,我的play应用程序在2.4.2中。 在开发人员模式下,我使用Source.fromFile(“./public/files/abc.json”)从后端控制器的公用文件夹中读取文件 当我将应用程序转换为生产模式时,我得到了文件未找到异常。我发现在生产模式下,公用文件夹被打包在资产罐中。如何使其在开发和生产模式下都能工作???您可以使用以下方法: Play.application().getFile("/public/foobar.baz"); : 获取相对于应用程序根路径的文件 你试过这个剧本

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


当我将应用程序转换为生产模式时,我得到了文件未找到异常。我发现在生产模式下,公用文件夹被打包在资产罐中。如何使其在开发和生产模式下都能工作???

您可以使用以下方法:

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

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


你试过这个剧本文档了吗?这对第2.4局没问题,即使是第2.3局,我也试过了

在那里,您可以找到这个,您可以在conf/routes文件中简单地执行此操作

GET  /assets/*file        controllers.Assets.at(path="/public", file)
文件->指的是文件名。 例如:myFile.json

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

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

这将在dist文件中包括您的“public”目录(您可以这样包括任何目录)。然后,您的应用程序将在生产环境中工作。

Play附带一个内置控制器,用于服务公共资产

该控制器在默认的Play JAR中作为controllers.Assets提供,并定义了一个带有两个参数的at操作:

at(路径:字符串,文件:字符串) path参数必须是固定的,并定义由操作管理的目录。文件参数通常是从请求路径中动态提取的

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

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

有两种方法可以解决此问题:- 1) 直截了当的一点是使用苏邦·维杰拉特纳在上述评论中的建议。 2) 第二种方法是,如果不想在应用程序的分发版本中添加额外的公用文件夹,请使用以下方法:- a) 复制conf文件夹中公用文件夹中的所有文件。 b) 使用Play的类加载器获取资源作为流。
c) 使用Source.fromInputStream方法将此inputstream转换为bufferedsource。现在,控制器可以使用此文件进行处理。

如果您使用的是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。有两种方法

相对路径(无前导斜杠)

绝对路径(需要前导斜杠)

我想如果你把文件放在conf文件夹中,你也必须在路径中排除conf


最后,您可以了解Java的资源加载是如何工作的。

您可以尝试从类路径中读取它:@user1869107“在生产模式下,Play的类加载程序只能从conf文件夹中读取文件”->这是不正确的。实际上,您可以在发行版中将其他资源目录添加到Play框架中。我将编辑我的答案并添加方法。这很有帮助,因为它为我指出了
resourceAsStream
方法这里给出的sbt指令也适用于Play 2.3!
scala.io.Source.fromInputStream(getClass.getClassLoader.getResourceAsStream(“public/test.txt”))
scala.io.Source.fromInputStream(getClass.getResourceAsStream(“/public/test.txt”))