Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PlayFramework 2.3.x:使用带有Play和Scala的URL访问公用文件夹_Scala_Playframework 2.3 - Fatal编程技术网

PlayFramework 2.3.x:使用带有Play和Scala的URL访问公用文件夹

PlayFramework 2.3.x:使用带有Play和Scala的URL访问公用文件夹,scala,playframework-2.3,Scala,Playframework 2.3,我正在使用web服务上传视频和图像,并将图像保存在我们的应用程序中。当我保存文件时,文件保存在应用程序文件夹的根目录下。我想使用localhosturl访问这些图像和视频,比如:我上传文件并保存在app root/upload/image.jpg下。在我的路由映射文件中,我声明路由如下: GET /uploads/ staticDir:/upload 如中所定义。但仍收到编译时错误:应调用控制器方法。我想访问这样的图

我正在使用web服务上传视频和图像,并将图像保存在我们的应用程序中。当我保存文件时,文件保存在应用程序文件夹的根目录下。我想使用
localhost
url访问这些图像和视频,比如:我上传文件并保存在
app root/upload/image.jpg
下。在我的路由映射文件中,我声明路由如下:

GET     /uploads/                                   staticDir:/upload 

如中所定义。但仍收到编译时错误:
应调用控制器方法
。我想访问这样的图像
http://localhost:9999/uploads/image.jpg

嗯。。。一种方法是添加以下路线

GET   /uploads/*file        controllers.Assets.at(path="/uploads", file)
但是,它会干扰现有路线的反向路由

GET     /assets/*file               controllers.Assets.at(path="/public", file)
然后,您必须将这两个资产路由用作-
@route.assets.at(“public”,filename)
@route.assets.at(“uploads”,filename)
,这意味着必须更改所有将公共资产路由用作-
@route.assets.at(filename)
的模板。在现有的大型项目中,这可能是一个麻烦

您可以使用以下方法来避免这种情况

创建另一个控制器,如下所示:, 包控制器

object FileServer extends Controller {

  def serveUploadedFiles1 = controllers.Assets.at( dicrectoryPath, file, false )

  // Or... following is same as above

  def serveUploadedFiles2( file: String ) = Action.async {
    implicit request => {
      val dicrectoryPath = "/uploads"
      controllers.Assets.at( dicrectoryPath, file, false ).apply( request )
    }
  }

}
上述措施本应奏效。。。但play似乎对请求的“资产”进行了大量元数据检查,这会导致所有
/uploads/filename
请求的结果都是空的。我试图查看play源代码以进行检查,但似乎需要一些时间才能弄清楚

因此,我认为我们可以使用以下更简单的方法(它可以通过许多方式进一步细化)

这意味着,它会尝试在目录中定位资源,这些目录是应用程序的
类路径的一部分,而我们的
uploads
文件夹肯定不是其中之一。所以我们可以通过在类路径中添加
上传
来让play的
资产发挥作用

但是。。。再想想。。。如果我回想一下,类路径中的所有文件夹都应该打包在打包构建部署时要部署的包中。上传的东西将由用户创建,这意味着他们不应该是包的一部分。这也意味着。。。我们不应该试图使用Play的
资产访问上传的内容

所以。。。我认为我们最好使用自己的
serveUploadedFiles
的更简单的基本实现

现在在管线文件中添加管线,如下所示:

GET         /uploads/*file                        controllers.FileServer.serveUploadedFiles( file:String )

还有。。。请记住,您不应该考虑使用play为您上传的资产提供服务。请使用nginx或类似工具。

GET/uploads/*file controllers.Assets.at(path=“/uploads”,file)
No@SarveshKumarSingh这不是方法。由此,我得到了另一个编译错误。请加入聊天根目录进行讨论。从图像的URL
访问图像时,我遇到以下浏览器错误http://localhost:9999/uploads/test.jpg 无法显示,因为它包含错误
@Sarvesh我有完全相同的想法并尝试了相同的事情,尽管在尝试加载资源时返回404。我试图复制
上传
目录的内部
目标/web
和根目录,但仍然不起作用。非常努力@SarveshKumarSingh,但使用第二个代码,我的文件被下载,而不是在浏览器中打开。是的。。。因为我们仍然缺少文件的
mime
-类型。添加适当的
mime
信息将使浏览器能够理解传入的文件类型,并且浏览器将尝试找出处理该文件的方法。@HarmeetInghtara我已进行了必要的更改,以便通过浏览器呈现文件(给定浏览器知道如何处理它们,所以png、jpeg、pdf等应该呈现…其他将被下载)
def resource(name: String): Option[URL] = for {
  app <- Play.maybeApplication
  resource <- app.resource(name)
} yield resource
GET         /uploads/*file                        controllers.FileServer.serveUploadedFiles( file:String )