PlayFramework 2.3.x:使用带有Play和Scala的URL访问公用文件夹
我正在使用web服务上传视频和图像,并将图像保存在我们的应用程序中。当我保存文件时,文件保存在应用程序文件夹的根目录下。我想使用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 如中所定义。但仍收到编译时错误:应调用控制器方法。我想访问这样的图
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 )