我是Rails的新手并且在用户登录后的项目上工作 他们可以点击一个链接来下载一个exe文件(比如说 文件位于http://test.com/test.exe)。我想保留exe的链接 文件隐藏。实施此步骤的最佳方法是什么。
我正在考虑使用重定向到网址,但我一直在使用 一个错误,说我不能在函数中使用两个重定向。
另外,我正在考虑使用NET:HTTP来使用http请求,但我没有 想法如何实现这一点。
谢谢!
答案 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。
答案 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