【问题标题】:accessing files stored on server from Sinatra app从 Sinatra 应用程序访问存储在服务器上的文件
【发布时间】:2012-01-18 20:26:51
【问题描述】:

我有一个机架空间云服务器,我在上面托管一个 Sinatra 应用程序。我的应用程序中有一个公共目录,用于存储我当前的样式、脚本等。我还有其他文件,但我不想在每次部署时都更新和传输。我正在使用 git 和 Vlad 进行部署,所以为了避免这种情况,我目前的流程是

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

简而言之,我希望能够访问我的用户文件夹中提供的文件,或者理想情况下还可以选择访问具有权限的服务器文件上的另一个用户,这样我就不需要总是将它们移动到当前手动发布。

谢谢

【问题讨论】:

  • 你不能用 vlad 从应用的公共文件夹创建符号链接到你需要的目录吗?

标签: ruby sinatra rack rackspace vlad-deployer


【解决方案1】:

假设您想直接从 Sinatra 提供静态文件(即您没有设置 Apache 或 Nginx 来提供它们),您可以使用Rack::Static。这仅在静态文件全部来自其他位置的子目录时才有效。例如,如果您有一堆 mp3 存储在 /home/other_user/files/mp3s 中,并且您像 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']

如果您希望能够访问位于 url 'base' 的文件,例如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'

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    相关资源
    最近更新 更多