Scala 无法使用play framework sendFile功能定位文件

Scala 无法使用play framework sendFile功能定位文件,scala,playframework,playframework-2.5,Scala,Playframework,Playframework 2.5,目标是能够下载和呈现(例如,个人资料图片)属于公共资产或私人资产的图像 在报告中,它说: Play为服务本地用户的常见任务提供易于使用的助手 文件: 如果要以内联方式提供此文件: def index = Action { Ok.sendFile( content = new java.io.File("/tmp/fileToServe.pdf"), inline = true ) } 这似乎是实现目标所需要的 现在,我有一个如下所示的目录结构,并希望提供文件1.png和

目标是能够下载和呈现(例如,个人资料图片)属于公共资产或私人资产的图像

在报告中,它说:

Play为服务本地用户的常见任务提供易于使用的助手 文件:

如果要以内联方式提供此文件:

def index = Action {
  Ok.sendFile(
    content = new java.io.File("/tmp/fileToServe.pdf"),
    inline = true
  )
}
这似乎是实现目标所需要的

现在,我有一个如下所示的目录结构,并希望提供文件
1.png
2.png

MyApp
|_ app
|_ conf
|_ public (all public assets)
   |_ images
      |_ 1.png
|_ private (more assets, not public)
   |_ images
      |_ 2.png
|_ ...
我定义了一个控制器函数,如下所示:

def sendImage() = Action {
  // Ok.sendFile(new java.io.File("/public/images/1.png"))
  // Ok.sendFile(new java.io.File("assets/images/1.png"))
  Ok.sendFile(new java.io.File("/private/images/1.png"))
}
尝试了各种不同的路径,绝对路径、相对路径,但当我从前端(React/Axios)调用此控制器函数时,它只返回“NoSuchFileException”

但是,我可以通过以下方式从前端呈现公共资产:

<img src='/assets/images/1.png' />   // from the public dir
//来自公共目录
同一路径在控制器内不起作用。无法确定Play期望其路径的方式

目前正在使用Play2.5

有什么想法吗?感谢您在控制器中注入对象,并使用应用程序对象中定义的
getFile
方法,如下所示

class JobInstanceController @Inject()(protected val app: Application) extends Controller {
  def test = Action {
    Ok.sendFile(app.getFile("public/images/1.png"))
  }
}
在控制器中注入对象,并使用应用程序对象中定义的
getFile
方法,如下所示

class JobInstanceController @Inject()(protected val app: Application) extends Controller {
  def test = Action {
    Ok.sendFile(app.getFile("public/images/1.png"))
  }
}

私有文件夹不在类路径中。我认为您需要将其添加到build.sbt文件中

unmanagedResourceDirectories in Compile += baseDirectory.value / "private"
看这里
私有文件夹不在类路径中。我认为您需要将其添加到build.sbt文件中

unmanagedResourceDirectories in Compile += baseDirectory.value / "private"
看这里
由@marcospereira发表的评论帮助解决了问题,谢谢


当在文件名之前使用
/
时,这需要文件的完整路径,而不是相对路径。您需要从
/private/images/1.png
更改为
private/images/1.png
,以便它与您的应用程序相关


但是,如果这些私有文件是由用户上传的,将它们放在应用程序目录中将被认为是一种不好的做法。部署应用程序的新版本时会发生什么?您可能会丢失这些文件,或者在部署时需要复制/移动它们。因此,在应用程序外部有一个目录来存储上传的文件。

由@marcospereira提供的注释有助于解析路径,谢谢


当在文件名之前使用
/
时,这需要文件的完整路径,而不是相对路径。您需要从
/private/images/1.png
更改为
private/images/1.png
,以便它与您的应用程序相关


但是,如果这些私有文件是由用户上传的,将它们放在应用程序目录中将被认为是一种不好的做法。部署应用程序的新版本时会发生什么?您可能会丢失这些文件,或者在部署时需要复制/移动它们。因此,在应用程序外部有一个目录来存储上传的文件。

当您在文件名之前使用
/
时,这需要文件的完整路径,而不是相对路径。您需要从
“/private/images/1.png”
更改为
“private/images/1.png”
,以便它与您的应用程序相关。但是,如果这些私有文件是由用户上传的,将它们放在应用程序目录中将被认为是一种不好的做法。部署应用程序的新版本时会发生什么?您可能会丢失这些文件,或者在部署时需要复制/移动它们。因此,在应用程序外部有一个目录来存储上传的文件。当您在文件名之前使用
/
时,这需要文件的完整路径,而不是相对路径。您需要从
“/private/images/1.png”
更改为
“private/images/1.png”
,以便它与您的应用程序相关。但是,如果这些私有文件是由用户上传的,将它们放在应用程序目录中将被认为是一种不好的做法。部署应用程序的新版本时会发生什么?您可能会丢失这些文件,或者在部署时需要复制/移动它们。因此,在应用程序外部有一个目录来存储上传的文件。