2

我将文件存储移动到 Rackspace Cloudfiles,它破坏了我的 send_file 操作。

老的

def full_res_download
  @asset = Asset.find(params[:id])
  @file = "#{Rails.root}/public#{@asset.full_res}"
  send_file @file
end

新的

def full_res_download
  @asset = Asset.find(params[:id])
  @file = "http://86e.r54.cf1.rackcdn.com/uploads/fake/filepath.mov"
  send_file @file
end

当文件在公共文件中时。代码效果很好。当您单击链接时,文件将下载并且网页不会更改。现在它给出了这个错误。

Cannot read file http://86e.r54.cf1.rackcdn.com/uploads/fake/filepath.mov

我错过了什么?

非常感谢您的参与。

4

2 回答 2

3

什么有效

def full_res_download
  @asset = Asset.find(params[:id])
  @file = open("http://86e.r54.cf1.rackcdn.com/uploads/fake/filepath.mov")
  send_file( @file, :filename => File.basename(@asset.file.path.to_s))
end

真实代码

控制器.rb

def web_video_download
  @asset = Asset.find(params[:id])
  @file = open(CDNURL + @asset.video_file.path.to_s)
  send_file( @file, :filename => File.basename(@asset.video_file.path.to_s))
end

发展.rb

CDNURL = "http://86e.r54.cf1.rackcdn.com/"
于 2013-01-02T22:21:57.253 回答
2

send_file打开一个本地文件并使用机架中间件发送它。您应该只重定向到 url,因为您不再托管该文件。

正如其中一条评论指出的那样,在某些情况下,由于各种原因,您可能无法使用重定向。如果是这种情况,您必须下载该文件并在检索后将其转发给用户。这样做的效果是向用户的转移将执行以下操作:

  1. 请求到达您的服务器,开始处理您的操作。
  2. 您的操作从 CDN 请求文件,并等待文件被完全检索到。
  3. 您的服务器现在可以将文件中继给最终用户。

这与重定向的情况相比:

  1. 请求到达您的服务器,开始处理您的操作。
  2. 您的操作会将用户重定向到 CDN。

在这两种情况下,用户都必须等待两个完整的连接,但是您的服务器已经节省了一些工作。因此,在情况允许时使用重定向会更有效。

于 2012-12-30T04:50:48.287 回答