从Sinatra app访问存储在服务器上的文件

时间:2011-12-12 21:34:17

标签: ruby sinatra rack rackspace vlad-deployer

我有一个机架式云服务器,我正在托管Sinatra应用程序。我在我的应用程序中有一个公共目录,我存储我当前的样式,脚本等。我有其他文件虽然我不想更新和转移每个部署。我正在使用git和Vlad进行部署,以避免我当前的进程

  • 进行本地更改和更新
  • 更新我的本地回购
  • 推送到git
  • run vlad:update
  • 然后手动ssh进入我的服务器并将项目中我想要的mp3和其他内容复制到当前版本的公用文件夹

简而言之,我希望能够访问我的用户文件夹中提供的文件,或者理想情况下也可以选择访问具有权限的服务器文件上的其他用户,这样我就不需要始终将它们移动到目前手动释放。

感谢

1 个答案:

答案 0 :(得分:0)

假设您想直接从Sinatra提供静态文件(即您没有设置Apache或Nginx来提供服务),您可以使用Rack::Static。这仅在静态文件全部从其他位置的子目录提供时才有效。例如,如果您在/home/other_user/files/mp3s中存储了一堆mp3,并且像http://example.com/mp3s/foo.mp3那样访问它们,那么您可以use the middleware这样:

use Rack::Static, :urls => ['/mp3s'], :root => '/home/other_user/files/mp3s'

如果您要提供其他子目录,例如, '/ images',只需将它们添加到:urls数组::urls => ['/mp3s', '/images']

如果您希望能够访问网址“基数”的文件,例如http://example.com/foo.mp3,那么Rack::Static就无法使用。在这种情况下,我们需要针对目录检查每个请求,如果存在匹配文件,则继续请求继续。 (当检查public目录时,Sinatra本身必须做这样的事情。)

实现这一目标的最简单方法可能是使用来自rack-contrib的Rack::TryStatic

require 'rack/contrib' #install rack-contrib first
use Rack::TryStatic, :urls => ['/'], :root => '/home/other_user/files/mp3s'

如果您使用其中任何一种,您可能需要确保只在适当的环境中配置中间件,否则在查找不存在的目录时,您将在开发中遇到错误。