我有一个深度结构的目录(很多子目录和文件),我从我的播放应用程序中读取。在我的电脑上,我使用 -
读取目录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上玩这个呢?
答案 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")
应该在生产环境中工作。