有关创建下载链接的问题

时间:2009-03-25 18:56:33

标签: ruby-on-rails http http-headers

我是Rails的新手并且在用户登录后的项目上工作 他们可以点击一个链接来下载一个exe文件(比如说 文件位于http://test.com/test.exe)。我想保留exe的链接 文件隐藏。实施此步骤的最佳方法是什么。

我正在考虑使用重定向到网址,但我一直在使用 一个错误,说我不能在函数中使用两个重定向。

另外,我正在考虑使用NET:HTTP来使用http请求,但我没有 想法如何实现这一点。

谢谢!

4 个答案:

答案 0 :(得分:1)

您应该在代码中读取文件并将其按原样输出到客户端。 在它之前发送相关标题:

Content-type: application/octet-stream  
Content-Disposition: inline; filename=[file name you want the user to see]  
Content-length: [file size]  

为什么在同一个地方进行两次重定向很糟糕,就像试图同时在两个方向上驾驶汽车一样......

使用

可能更好
Content-Type: application/force-download

而不是

Content-type: application/octet-stream

答案 1 :(得分:1)

似乎没有人提到过X-Sendfile。

File Downloads Done Right

答案 2 :(得分:0)

要通过控制器代理文件,可以使用open-uri。

在environment.rb

require 'open-uri'

在您的控制器中

def download
  send_data(open(params[:url]).read,
    :filename => 'somefilename',
    :disposition => 'attachment'
  )
end

编辑:如果您不想代理该文件,则必须redirect_to(url)。如果您收到有关重定向两次调用的消息,请记住,您不能同时渲染和重定向同一操作。如果需要加载视图,然后开始下载,请使用以下两个操作:

def present_download
  @download = Download.find(params[:id])
  # implicitly calls render :action => :present_download
end

def download_file
  @download = Download.find(params[:id])
  respond_to do |format|
    format.html { redirect_to(@download.url) }
  end
end

在您的观点中(present_download.html.erb):

<html>
  <head>
    <meta http-equiv="refresh" content="1;url=<%= url_for :action => :download_file -%>" />
  </head>
  <body>
    Your download will automatically start…
…

答案 3 :(得分:0)

我尝试了下面的代码,只是一个示例exe文件,但代码看起来就是读取超过500 MB的整个文件。我希望它只是给我保存exe文件的选项谢谢!

  def download
    send_data(open('http://mirrors.gigenet.com/ubuntu/intrepid/ubuntu-8.10-desktop-i386.iso').read,
    :filename => 'ubuntu-8.10-desktop-i386.iso' ,
    :type => 'application/force-download',
    :disposition => 'attachment')
  end