在控制器类中,我需要加载一个文本文件。我将此文件放在public
文件夹中并编写了一个对象,该文本文件以字符串形式提供。
object FooResources {
def load(filePath: String): String = {
Play.getExistingFile(filePath) match {
case Some(file) => Files.readFile(file)
case _ => throw new IOException("file not found: " + filePath)
}
}
}
在控制器类中,我只需调用:
val js = FooResources.jsTemplate("public/jsTemplate.js")
。
这在DEV模式下工作正常,但是当我通过play clean compile stage
暂存项目并从./start
开始时,我在尝试加载文件时会收到异常。
更新:
当我从sbt(或play)中通过start
命令启动项目时,文件已成功加载。只有当我通过目标目录中的./start
启动应用程序时,它才不会。
答案 0 :(得分:4)
当您使用dist
或stage
目标时,您的资源会包含在Jar文件中,而不是文件系统中。
因此,您必须使用相对于类路径的输入流。为此,请查看Play object中的Play.api.resourceAsStream()方法。
也许这样的事情(没有测试过)
object FooResources {
def load(filePath: String): InputStream = {
Play.resourceAsStream(filePath) match {
case Some(is) => scala.io.Source.fromInputStream(is).getLines().mkString("\n")
case _ => throw new IOException("file not found: " + filePath)
}
}
}