从Heroku上的Play框架中的目录中读取文件

时间:2014-01-13 06:31:16

标签: scala heroku playframework-2.0

我有一个深度结构的目录(很多子目录和文件),我从我的播放应用程序中读取。在我的电脑上,我使用 -

读取目录
val directory = Play.getFile("directory")
for(file <- directory.listFiles) {
  val lines = Source.fromFile(file).getLines()
}

这在我的电脑上完美运行,但在Heroku上没有。在Heroku上,我在第2行(代码上面)获得了一个NPE,这意味着目录对象没有被制作。

类似问题的

This suggestion表明我可以将我的目录放在 public 中,并使用 Play.resource API将其读取。但我不想把我的目录放在 public 中。我需要列出目录的内容,因为它可能正在改变......我怎么能在Heroku上玩这个呢?

3 个答案:

答案 0 :(得分:0)

Play.getFile(relativePath)检索相对于当前应用程序根路径的文件。当前应用程序的根路径在您的PC和Heroku上可能不一样。

还有一件事:您的目录对象没有发表的声明不正确。 listFiles操作在您的情况下抛出NPE。

尝试此操作以获取目录中的文件列表:

 val listOfFilesInDirectory: List[java.io.File] = Option(getClass.getResource("/directory")).map(_.toURI).map(new java.io.File(_)).map(_.listFiles).flatten.toList

答案 1 :(得分:0)

您可以将文件放在conf文件夹下,以免文件公开。然后使用:

Play.resource("conf/directory"): Option[URL]

Play.resourceAsStream("conf/directory"): Option[InputStream]

答案 2 :(得分:0)

正如this建议的那样,为了使Play.getFile("location_from_project_root")(或任何其他类似的)在生产环境中工作,您必须明确要求从播放中添加放置文件的目录, dist。

例如:

您想要访问文件Project_Root/resources/mtFile.json,(您创建的/resources文件夹内),可以使用Play.getFile("/resources/mtFile.json")方法。

但是为了使其适用于任何生产环境,您必须将/resources文件夹添加到dist。否则该文件将不存在。为此,您必须将这些行添加到build.sbt文件中。

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

现在,如果您使用activator dist命令使用dist,您可以看到名为/resources的目录已添加到dist的根目录中。现在Play.getFile("/resources/mtFile.json")应该在生产环境中工作。