使用rails创建一个带有rails的下载链接到外部文件

时间:2012-12-30 04:46:16

标签: ruby-on-rails rackspace-cloud rackspace sendfile

我将文件存储移动到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

我缺少什么?

非常感谢您的时间。

2 个答案:

答案 0 :(得分:2)

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

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

  1. 请求到达您的服务器,开始处理您的操作。
  2. 您的操作从CDN请求文件,并等待文件完全检索。
  3. 您的服务器现在可以将文件转发给最终用户。
  4. 与重定向的情况相比:

    1. 请求到达您的服务器,开始处理您的操作。
    2. 您的操作会将用户重定向到CDN。
    3. 在这两种情况下,用户都必须等待两个完整的连接,但是您的服务器已经保存了一些工作。因此,在环境允许的情况下使用重定向会更有效。

答案 1 :(得分:2)

什么有用

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

真实代码

controler.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

development.rb

CDNURL = "http://86e.r54.cf1.rackcdn.com/"