2009-10-09 6 views
1

나는이 짓을했는지 :컨트롤러 동작에서 공개 디렉터리에있는 파일을 강제로 다운로드 하시겠습니까?

<% response.headers['Content-Disposition'] = "attachment; 
     filename=somefile.txt" -%> 

I am a text file! 

내가 경로를 공개하지 않고 내 공용 폴더에있는 파일의 다운로드를 강제하고 싶습니다, 그래서 검사보다 컨트롤러에게 위치를 알아야 할 PARAMS있어 내 파일 (내 공용 폴더에 있음)을 다운로드 한 다음 강제로 다운로드하려고합니다.

<% response.headers['Content-Disposition'] = "attachment; 
     filename=#{@invoice.file_name}" %> 

How do I get the file content to be here rather than this text? 

이렇게 할 수있는 방법이 있습니까?

답변

5

나는 send_file이 원하는대로 할 것이라고 생각합니다.

send_file '/path/to.file', :type => 'text/plain', :disposition => 'inline' 
+1

"파일을 읽을 수 없습니다 /path/to/file.pdf"이겠지만 거기에 있습니다 –

+0

(웹 서버가 실행되는) 사용자가 모두 액세스 할 수 있습니까? 디렉토리까지 파일로? –

+0

나는이 게시물의 도움으로 모든 것을 리팩토링했다. http://harrylove.org/2008/12/22/protected-file-downloads-with-ruby-on-rails-and-paperclip 결국 send_file을 사용하시오. –

3

헤더 정의는보기의 작업이 아닙니다. 그것을 컨트롤러에서하는 것이 훨씬 더 깨끗합니다. 사실 그런 종류의 파일을 렌더링하기 위해 HTML보기가 필요하지 않습니다. 이 같은

이렇게 뭔가 더 적합 할 것입니다 :

def action 
    response.headers['Content-Disposition'] = 'attachment; filename=somefile.txt' 
    return render(:text => File.read('/path/to/your/file.txt') 
end 

당신은 (보기에 작업 코드를 가지고 있지) 깨끗하게 일을 유지하고 적절하게 파일의 다운로드를 강제로.

+1

아, 파일이 너무 크면 send_file을 사용하여 스트리밍 할 수 있습니다. http://api.rubyonrails.org/classes/ActionController/Streaming.html –

+0

PDF 파일이므로 해당 파일이 없다는 오류가 표시됩니다. 해당 경로를 복사하여 브라우저에 붙여 넣으면 파일이 존재합니다. 나는이 작업을 할 수 있기를 정말로 희망한다. 그렇지 않으면 나는 많은 것들을 리팩터링해야한다. ( –

+0

당신은 시스템 경로를 넣어야한다 .http 서버가 아님 –

관련 문제