从生产中播放框架中的 public 文件夹中读取文件
Reading Files from public folder in play framework in production
我的 play 应用是 2.4.2。
在开发人员模式下,我曾经使用 Source.fromFile("./public/files/abc.json")
从后端控制器的 public 文件夹中读取文件
当我将应用程序转换为生产模式时,出现找不到文件异常。我发现 public 文件夹打包在生产中的资产 jar 中 mode.What 我可以这样做吗,以便它在开发和生产模式下都能工作??
你可以使用这个方法:
Play.application().getFile("/public/foobar.baz");
Get a file relative to the application root path.
您试过这个 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")
这会将您的 'public' 目录包含在 dist 文件中(您可以像这样包含任何目录)。然后您的应用程序将在生产环境中运行。
Play 带有一个内置控制器来处理 public 个资产。
控制器在默认的 Play JAR 中可用 controllers.Assets 并定义了一个带有两个参数的动作:
Assets.at(路径:字符串,文件:字符串)
路径参数必须是固定的,并定义了操作管理的目录。文件参数通常是从请求路径中动态提取的。
这是您的 conf/routes 文件中资产控制器的典型映射:
GET /assets/*file controllers.Assets.at(path="/public", file)
有两种方法可以解决这个问题:-
1) 直接的一个是使用 Supun Wijerathne 在上面的评论中建议的。
2) 第二种是使用以下方法,如果不想在应用程序的分发版本中添加额外的 public 文件夹:-
a) 将 public 文件夹中的所有文件复制到 conf 文件夹中。
b) 使用 Play 的类加载器将资源作为流获取。
c) 使用 Source.fromInputStream 方法将此输入流转换为缓冲源。现在,控制器可以使用此文件进行处理。
如果您使用的是 scala 2.12,请使用 Source.fromResource 而不是 Source.fromFile。
示例:
如果将文件放在 public 文件夹中,请不要使用前导斜杠。
Source.fromResource(“public/files/abc.txt”)
如果将文件放在conf文件夹中,请不要在路径中包含conf。
Source.fromResource(“files/abc.txt”) // conf/files/abc.txt
如果您使用的是 scala < 2.12,您可以回退到 Java。有2种方法。
相对路径(无前导斜杠)
scala.io.Source.fromInputStream(getClass.getClassLoader.getResourceAsStream(“public/test.txt”))
绝对路径(需要前导斜杠)
scala.io.Source.fromInputStream(getClass.getResourceAsStream(“/public/test.txt”))
我想如果您将文件放在 conf 文件夹中,您还必须在路径中排除 "conf"。
最后,您可以在此 blog 中了解 Java 的资源加载工作原理。
我的 play 应用是 2.4.2。 在开发人员模式下,我曾经使用 Source.fromFile("./public/files/abc.json")
从后端控制器的 public 文件夹中读取文件当我将应用程序转换为生产模式时,出现找不到文件异常。我发现 public 文件夹打包在生产中的资产 jar 中 mode.What 我可以这样做吗,以便它在开发和生产模式下都能工作??
你可以使用这个方法:
Play.application().getFile("/public/foobar.baz");
Get a file relative to the application root path.
您试过这个 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")
这会将您的 'public' 目录包含在 dist 文件中(您可以像这样包含任何目录)。然后您的应用程序将在生产环境中运行。
Play 带有一个内置控制器来处理 public 个资产。
控制器在默认的 Play JAR 中可用 controllers.Assets 并定义了一个带有两个参数的动作:
Assets.at(路径:字符串,文件:字符串) 路径参数必须是固定的,并定义了操作管理的目录。文件参数通常是从请求路径中动态提取的。
这是您的 conf/routes 文件中资产控制器的典型映射:
GET /assets/*file controllers.Assets.at(path="/public", file)
有两种方法可以解决这个问题:- 1) 直接的一个是使用 Supun Wijerathne 在上面的评论中建议的。 2) 第二种是使用以下方法,如果不想在应用程序的分发版本中添加额外的 public 文件夹:- a) 将 public 文件夹中的所有文件复制到 conf 文件夹中。 b) 使用 Play 的类加载器将资源作为流获取。 c) 使用 Source.fromInputStream 方法将此输入流转换为缓冲源。现在,控制器可以使用此文件进行处理。
如果您使用的是 scala 2.12,请使用 Source.fromResource 而不是 Source.fromFile。
示例:
如果将文件放在 public 文件夹中,请不要使用前导斜杠。
Source.fromResource(“public/files/abc.txt”)
如果将文件放在conf文件夹中,请不要在路径中包含conf。
Source.fromResource(“files/abc.txt”) // conf/files/abc.txt
如果您使用的是 scala < 2.12,您可以回退到 Java。有2种方法。
相对路径(无前导斜杠)
scala.io.Source.fromInputStream(getClass.getClassLoader.getResourceAsStream(“public/test.txt”))
绝对路径(需要前导斜杠)
scala.io.Source.fromInputStream(getClass.getResourceAsStream(“/public/test.txt”))
我想如果您将文件放在 conf 文件夹中,您还必须在路径中排除 "conf"。
最后,您可以在此 blog 中了解 Java 的资源加载工作原理。