3

在控制器类中,我需要加载一个文本文件。我将此文件放在文件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并开始 via./start时,尝试加载文件时出现异常。

更新:当我通过命令从 sbt (或播放)中启动项目时start,文件已成功加载。只有当我./start在目标目录中启动应用程序时,它才不是。

4

1 回答 1

4

当您使用distorstage目标时,您的资源包含在 Jar 文件中,而不是文件系统中。

所以你必须使用相对于你的类路径的输入流。为此,请查看Play 对象中的 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)
    }
  }
}
于 2012-09-08T13:24:52.293 回答