我想我理解这里的问题是因为我不久前遇到(并解决了)至少它的一部分。
我有一些大的mp3's和我链接到他们对我的website
的几个问题
- 我需要设置我的内容处置头附件,以防止文件每当用户点击下载按钮时自动流式传输
- 我的文件位于远程服务器上
- 我的文件比较大(100MB)
- 大文件会占用轨道控制器,如果处理不当
现在,迈克尔Koziarsky建议在this article该服务大文件时保持轨道的最佳方式过程中自由,是创建在您的控制器下载行为,以及这样做(注意使用x_sendfile =>真):
def download
send_file '/path/to/podcast.mp3', :type => 'application/octet-stream', :disposition => 'attachment', :filename=>'something.mp3', :x_sendfile=>true
end
:x_sendfile告诉阿帕奇乐通过不占用轨道控制器进程的文件。代码的其余部分设置文件名和内容处置标题。
很好,但是我在heroku,像现在的其他人。所以我不能使用x_sendfile。
我发现我不能修改nginx的配置文件,无论是作为它的锁定由Heroku的所以这是不可能得到X-加速 - 重定向(Nginx的当量X-的sendfile)工作
所以,我决定增加一个perl script(见下文),我们的资产主机上的cgi-bin这个脚本设置内容处置,以附件并给我们的文件名了。
而不是做这样的宁静下载:
link_to "download", download_podcast_path(@podcast.mp3)
我们只是链接到MP3确保我们走在通过的cgi-bin,使perl脚本被调用的每一个离开的mp3服务器
# I'm using haml
%a{:href=>"http://afmpodcast.com/cgi-bin/download.cgi?ID=#{@podcast.mp3}"}
download
的结果是,我的轨控制器不再投入战斗,当有人下载文件
我发现Perl脚本here连砍它一点为我工作:
#!/usr/local/bin/perl -wT
use CGI ':standard';
use CGI::Carp qw(fatalsToBrowser);
my $files_location;
my $ID;
my @fileholder;
$files_location = "../";
$ID = param('ID');
open(DLFILE, "<$files_location/$ID") || Error('open', 'file');
@fileholder = <DLFILE>;
close (DLFILE) || Error ('close', 'file');
print "Content-Type:application/x-download\n";
print "Content-Disposition:attachment;filename=$ID\n\n";
print @fileholder
我的代码,是github但你可能有各种各样的使用它你的机器上的问题,因为我做重使用存储在bashrc中的ENV变量,并且我没有文档或测试^隐藏^
嗨。 (前言通过说要下载的文件位于Rails服务器以外的服务器上。)在我的Rails控制器中,我可以设置Content-Disposition标头,但是如何在控制器中指定文件的URL下载。目前,我正在使用 r = Net :: HTTP.get_response() @content = r.body render:layout => false ...在我看来,我呈现<%= @content =>和I确实得到保存作为提示...但只有在文件完全加载后。对于视频文件,这需要很长时间。 但也许我不需要实际加载文件? 想法? – lagouyn 2010-08-20 19:32:53
好的抱歉,这是一个Rails特有的问题,我不能说这么多。为了吸引更多Rails专家,我重申了你的问题。通常,您只发送标题,然后开始发送要传输的文件的二进制数据。不知道你描述的是否会导致这种行为,似乎并不如此。 – Nicolas78 2010-08-21 08:55:45