Rails3: ссылки на сторонние mp3-файлы и их сохранение на жестком диске пользователя, а не в браузере - PullRequest
1 голос
/ 16 июля 2010

У меня есть несколько очень больших mp3-файлов, хранящихся в удаленном месте, и в настоящее время я ссылаюсь на них следующим образом:

= link_to "mp3", "http://website-where-file-is-stored.com/file-123456.mp3"

Когда пользователь нажимает на ссылку, файл начинает воспроизводиться в браузере. Я хочу, чтобы файл загружался на жесткий диск пользователя после того, как он щелкнул ссылку.

Я прочитал несколько статей, таких как , эта и , эта , которые продвигают методы, которые работают в разных ситуациях, для моей собственной.

У меня есть несколько файлов. Каждый файл хранится на удаленном сервере, на котором не запущено приложение rails.

Я не требую авторизации пользователей перед загрузкой чего-либо, поэтому я не хочу, чтобы мое приложение rails вызывалось каким-либо образом, поскольку мне нужно быть консервативным с моими процессами rails.

Это то, что мне нужно сделать в config.ru? Есть ли руководство или учебник, подробно описывающий лучший способ сделать это?

Я знаю, что мне нужно установить заголовок Content-Disposition, но, как я уже сказал, я не могу понять, как это сделать, у меня не запущено приложение rails на удаленном сервере, это просто куча серверного пространства .

Ответы [ 2 ]

1 голос
/ 16 июля 2010

Вы можете выполнить действие контроллера где-нибудь, предназначенное для загрузки файлов.

Итак, link_to переходит к этому действию, которое каким-то образом знает, какой файл хочет пользователь (либо перетаскивая весь URL-адрес в переменную запроса, либо каким-либо другим методом, подходящим для вашего приложения).

Это действие делает redirect_to http://website-where-file-is-stored.com/file-123456.mp3

Когда большинство современных браузеров сталкиваются с такой ситуацией, они не будут отображать пустую страницу и начинать загрузку - они начнут загрузку, но затем оставят пользователя на исходной странице с link_to. Отлично!

Чтобы файл загружался в качестве вложения и не отображался в браузере (например, для фильма или PDF), website-where-file-is-stored.com должен предоставить файл с заголовком Content-disposition: attachment , Подробнее здесь: http://www.boutell.com/newfaq/creating/forcedownload.html

0 голосов
/ 20 июля 2010

ОК, я исправил это, добавив следующий cgi-скрипт в cgi-bin на моем удаленном сервере. скрипт устанавливает заголовок Content-Disposition. В моем случае скрипт называется "download.cgi" .

#!/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

И вместо того, чтобы делать link_to 'Download', "http://path/to/filename.mp3", я делаю это:

link_to 'Download' "http://path/to/cgi-bin/download.cgi?ID=filename.mp3"

Если вы хотите использовать тот же сценарий, просто помните, что строка: $files_location = "../" - это относительный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...