2010-07-16 6 views
1

브라우저에서 사용자의 하드 드라이브가 아닌 스트림에 저장하도록 연결하는 매우 큰 MP3의 원격 위치에 저장 내가 현재 지금처럼 링크 :Rails3 : MP3 파일을 오프 사이트 및 그들에게 내가 가진

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

사용자가 링크를 클릭하면 파일이 브라우저에서 재생되기 시작합니다. 사용자가 링크를 클릭 한 후 파일을 하드 드라이브에 다운로드하고 싶습니다.

다른 상황에서 내 자신에게 맞는 방법을 홍보하는 this onethis one 같은 기사를 읽었습니다.

여러 파일이 있습니다. 각 파일은 레일 앱이 실행되지 않는 원격 서버에 저장됩니다.

아무 것도 다운로드하기 전에 사용자의 승인을받을 필요가 없으므로 내 레일 프로세스를 보수적으로 사용해야하므로 레일 앱이 어떤 식 으로든 작동하도록하고 싶지는 않습니다.

내가 config.ru에서해야 할 일인가요? 이 작업을 수행하는 가장 좋은 방법을 자세히 설명하는 가이드 또는 자습서가 있습니까?

나는 Content-Disposition 헤더를 설정해야하지만, 내가 말했듯이 원격 서버에서 레일 앱을 실행하지 않는 방법을 알아낼 수는 없다. 단지 서버 공간 일 뿐이다.

답변

0

좋아, 다음 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"을하는

나는이 작업을 수행 : $files_location = "../" 상대 경로입니다 :

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

이 같은 스크립트를 사용하여 바로 선이 있음을 명심하십시오.

1

파일 다운로드 전용 컨트롤러 어딘가에 컨트롤러 작업을 할 수 있습니다.

그래서 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

안녕하세요. 감사합니다. 나는 그것을 시도했지만 quicktime 플러그인을 설치했기 때문에 파일이 재생되기 시작했습니다. 나는 현재 레일 콘트롤러가 더 많은 일을 할 수 있도록 랙을 나에게 돌보기 위해 랙을 얻는 방법을 찾고있다. 그러나 제안에 대해 많은 감사를 표한다. – stephenmurdoch

+0

그 문제를 해결하기 위해 Content-disposition 헤더를 설정해야합니다. 위의 대답을 편집했습니다. –

+0

감사합니다. 나는 콘텐츠 처리 헤더를 수정해야하지만 원격 서버에 설정하는 데 문제가 있다고 생각했습니다. 호출 응용 프로그램에서 수행 할 수 없으므로 서버에서 수행해야합니다. 어쨌든 Content-Disposition 헤더를 설정하는 원격 서버의 cgi bin에 perl 스크립트를 작성하여이 문제를 해결했습니다. 어쨌든 고마워. – stephenmurdoch