Я думаю, что понимаю проблему здесь, потому что я столкнулся (и решил) по крайней мере частично сам не так давно.
У меня есть несколько больших mp3, и я ссылаюсь на них в своих сайт
Несколько проблем
- Мне нужно было установить в заголовке content-disposition значение вложение, чтобы файлы не передавались автоматически, когда пользователь нажимает кнопку загрузки.
- мои файлы находятся на удаленном сервере
- мои файлы большие (100 МБ)
- большие файлы могут связывать рельсовые контроллеры, если с ними не обращаться должным образом
Теперь Майкл Козиарски советует в этой статье strong >, что лучший способ сохранить ваши процессы rails свободными при обслуживании больших файлов - это создать действие загрузки в вашем контроллере и сделать что-то вроде этого (обратите внимание на использование x_sendfile => true сильный>):
def download
send_file '/path/to/podcast.mp3', :type => 'application/octet-stream', :disposition => 'attachment', :filename=>'something.mp3', :x_sendfile=>true
end
: x_sendfile сообщает apache пропустить файл, не привязывая процесс контроллера rails. Остальная часть кода устанавливает имя файла и заголовок размещения содержимого.
Отлично, но я нахожусь на героку, как все сейчас. Поэтому я не могу использовать x_sendfile.
Я обнаружил, что не могу изменить файл конфигурации nginx, так как он заблокирован heroku, поэтому было невозможно получить x-accl-redirect (эквивалент x-sendfile сильный>) рабочий
Итак, я решил добавить сценарий perl (см. Ниже) в cgi-bin на нашем хосте-ассете, и этот скрипт устанавливает для content-disposition значение вложение и также дает имя нашему файлу.
Вместо такой спокойной загрузки:
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
В результате мой контроллер rails больше не запускается, когда кто-то загружает файл.
Я нашел скрипт Perl здесь и немного порезал его, чтобы он работал для меня:
#!/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, но у вас, вероятно, возникнут всевозможные проблемы, используя его на своем компьютере в качестве Я активно использую переменные ENV, которые храню в bashrc, и у меня нет документации или тестов ^ скрывает ^
person
stephenmurdoch
schedule
29.08.2010