【问题标题】:Reading files from directory in Play framework on Heroku从 Heroku 上 Play 框架中的目录读取文件
【发布时间】:2014-01-31 20:07:42
【问题描述】:

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

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

这在我的 PC 上完美运行,但在 Heroku 上却不行。在 Heroku 上,我在第 2 行(代码上方)得到了 NPE,这意味着没有生成 directory 对象。

类似问题的

This suggestion 建议我可以将我的目录放在 public 中并像使用 Play.resource API 一样读取它。但我不想把我的目录放在 public 中。而且我需要列出目录的内容,因为它可能会发生变化......我如何在 Play on Heroku 中做到这一点?

【问题讨论】:

  • 您找到解决方案了吗?我认为问题在于那些资源目录尚未添加到发行版中。为此,您必须明确提及要在 Play 框架中添加的目录。
  • @SupunWijerathne 仅适用于公众。我的问题是专门针对非公开的
  • 那么在调用 Play.getFile() 时是否出现“找不到文件”错误?

标签: scala heroku playframework-2.0


【解决方案1】:

正如this 建议的那样,为了使Play.getFile("location_from_project_root")(或任何其他类似的)在生产环境中工作,您必须从play 中明确要求将您放置文件的目录添加到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") 应该可以在生产环境中使用了。

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

    • 这仅在目录位于 public 下并且我将 URL 指定为“public/directory”时才有效。我想把我的目录放在public
    • 如果您将此目录名称指定为环境变量,以便您可以在 Heroku 和您的 PC 上进行不同的设置,会发生什么?
    【解决方案3】:

    您可以将您的文件放在您的conf 文件夹下,这样文件就不会被公开。然后使用:

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

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

    【讨论】:

    • 我认为这是因为您无法将目录作为资源打开,因为该目录位于您的类路径中。你有没有可以包含要打开的文件列表的索引文件?
    • 这就是我最终要做的——保留一个具有目录/文件结构的索引文件。但这不是一个好的解决方案:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多