【问题标题】:Direct serving files from outside of Play directories structure从 Play 目录结构之外直接提供文件
【发布时间】:2012-05-28 16:28:34
【问题描述】:

各位玩家

我需要为小型应用程序创建类似 CDN 的自定义解决方案,并想知道直接使用 Play 提供文件但不放在应用程序的 public 目录下的最佳方式是什么?我需要访问 FTP-upload 文件夹。

假设我的应用程序从/home/myaccount/playapps/app201 文件夹运行,并且在http://somedomain.tld 地址可用。我还有一个普通的 FTP 帐户,其文件夹指向 /home/myaccount/ftp_upload

提供文件/home/myaccount/ftp_upload/folder_1/sub_2/file.txt 的最佳方式是什么 http://somedomain.tld/ftp_upload/folder_1/sub_2/file.txt(没有任何检查和限制)?

  • 一种选择是使用 HTTP 服务器并为 ftp folder 设置单独的 hostalias,但我想避免在某些节点上使用额外的服务器(ref: 如果您正在寻找服务器解决方案,请查看sample config)。
  • 第二个是写Application.serve(String filepath) action + route,但在提供文件之前我不需要任何额外的操作。使用这种方法有意义吗?

还有其他选择吗?

(这个问题也可以在Google Groups获得)

【问题讨论】:

  • 我可以问一些细节吗? CDN 的部分用处——至少在我看来——是您的请求不包含 cookie,因为它会占用不必要的带宽。这是您想要的解决方案的一部分,例如服务来自www.example.com 的动态请求和来自cdn.example.com(或完全不同的顶级域名)的静态请求(CDN)?此外,您的大多数请求是静态的 (CDN) 还是动态的?也许你有一个粗略的百分比。它还有助于了解您的主要静态数据集是否很小,例如 90% 的静态请求最多为几 GB 的数据。
  • @Carsten,谢谢回复。我想将大型媒体文件和其他fully public 东西放在应用程序结构之外,因为我不需要对其进行访问控制。在这种情况下,应用程序包含路径和元数据 - 并且是前端渲染。我的目标可以很容易地通过使用前端 http 服务器和某个文件夹的别名来证明 [在此处描述](stackoverflow.com/a/10884297/1066240),但我想避免使用 HTTP 服务器。另一方面,我认为我也可以在端口 80 和一些轻量级服务器上部署应用程序来捕获静态请求。(将更多...)
  • @Caresten: (...more :)) 我刚刚意识到(感谢您)从其他域提供这些数据会阻止 cookie 发送,这也是提高性能的好点。

标签: playframework cdn playframework-2.0


【解决方案1】:

如果您的 Play 文件夹和 FTP 文件夹在同一主机上,您可以使用公共资源。来自documentation

请注意,如果您在“公共”之外定义资产映射,则需要告知 sbt 关于它,例如如果你愿意:

GET  /assets/*file               controllers.Assets.at("/public", file)
GET  /liabilities/*file          controllers.Assets.at("/foo", file)

你应该把它添加到project/Build.scala的项目设置中

// Add your own project settings here
playAssetsDirectories <+= baseDirectory / "foo"

我没有测试它,但值得一试:-)

【讨论】:

  • nico_ekito:谢谢你的回答,但不幸的是无法让它工作。我会继续努力,如果有任何进展会通知您。
  • 这是否需要您自己的控制器,因为 Assets 控制器会预先复制和编译所有资产,即当您启动 Play 时该文件必须存在?如果您稍后上传文件,它将不起作用。
猜你喜欢
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 2019-01-29
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
相关资源
最近更新 更多