Ruby on rails 使用rails创建一个到外部文件的下载链接,该文件的URL为

Ruby on rails 使用rails创建一个到外部文件的下载链接,该文件的URL为,ruby-on-rails,rackspace-cloud,rackspace,sendfile,Ruby On Rails,Rackspace Cloud,Rackspace,Sendfile,我将文件存储移动到Rackspace Cloudfiles,这破坏了我的发送文件操作 古老的 新的 当文件在公共文件中时。代码工作得很好。当你点击链接时,文件将被下载,网页不会改变。现在它给出了这个错误 Cannot read file http://86e.r54.cf1.rackcdn.com/uploads/fake/filepath.mov 我错过了什么 非常感谢您抽出时间。发送文件打开一个本地文件,并使用机架中间件发送。您应该重定向到url,因为您不再托管该文件 正如其中一条评论所指

我将文件存储移动到Rackspace Cloudfiles,这破坏了我的发送文件操作

古老的 新的 当文件在公共文件中时。代码工作得很好。当你点击链接时,文件将被下载,网页不会改变。现在它给出了这个错误

Cannot read file http://86e.r54.cf1.rackcdn.com/uploads/fake/filepath.mov
我错过了什么


非常感谢您抽出时间。

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

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

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

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

    什么有效 实码 controller.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/"
    

    如果重定向不是一个选项(身份验证、内部网络),则必须首先在本地下载文件并从那里发送-这是一种解决此问题的低效方法。如果出于任何原因无法重定向,那么你不应该使用CDN。Tehgeekmeister谢谢你提供的信息,但我会小心地将意见陈述作为事实传递。我不清楚什么是意见。如果你能指出这一点,我很乐意编辑我的答案/评论来解决这个问题,因为我的观点与其说是观点,不如说是可以根据需要扩展的速记陈述。更新我的答案以限制可能看起来像观点的内容,并更多地坚持事实。
    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
    
    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
    
    CDNURL = "http://86e.r54.cf1.rackcdn.com/"