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

问题描述 投票:8回答:6

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

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

playframework playframework-2.4
6个回答
4
投票

你试过这个Play Documentation 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文件中的'public'目录(您可以包含任何类似的目录)。然后您的应用程序将在生产环境中工作。


2
投票

您可以使用此方法:

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

Method Doc

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


0
投票

Play附带一个内置控制器来为公共资产提供服务。

控制器在默认的Play JAR中可用作controllers.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.


0
投票

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


0
投票

找到解决方案:需要使用资产调用这些资源/


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”。

最后,您可以了解Java的资源加载如何在此blog中运行。

© www.soinside.com 2019 - 2024. All rights reserved.