2012-03-12 7 views
9

우리는 현재 Heroku에서 호스팅되는 Rails 애플리케이션을 개발 중입니다. 우리는 PDF를 생성하고 사용자에게 다운로드하여 다운로드하려고합니다.Heroku에서 Heroku 사용하기

우리는 새우를 사용하여 PDF 세대를 처리합니다.

PDF를 생성하기위한 우리의 코드는 현재 :

Prawn::Document.generate @name[0]+ ".pdf" do 

문서를 생성하기 위해 우리의 모든 코드 하였다. 불행하게도, 이것은 디스크에 문서를 저장하는데, Heroku에서 호스팅되는 응용 프로그램에 대해서는 내 지식으로는 불가능합니다.

우리는 다음

send_file "#{Rails.root}/"[email protected][0]+ ".pdf", :type => 
'application/pdf',:filename => @name[0]+ ".pdf" 

첫 번째 디스크에 문서를 저장하지 않고 직접 사용자에게 문서의 다운로드를 밀어 새우를 사용하는 방법이 있나요 사용하여 사용자에게 밀어? 그렇지 않다면 파일을 보내기 전에 파일을 디스크에 저장하지 않아도되는 PDF 생성을위한 다른 보석이 있습니까?

답변

7

Aspen/Bamboo의 경우 응용 프로그램 디렉토리의 tmp/ 디렉토리 (가능하면 Rails.root.join("tmp")) 또는 하위 디렉토리에 파일을 디스크에 저장할 수 있습니다.

Cedar에서 파일을 응용 프로그램 디렉터리의 디스크에 저장할 수 있지만 응용 프로그램의 tmp/ 디렉터리의 하위 디렉터리는 계속 선택해야합니다.

두 경우 모두 저장된 파일은 임시 파일입니다. 응용 프로그램의 두 실행중인 인스턴스간에 공유되지 않습니다. 다시 시작할 때까지 유지되지 않습니다. 하나의 요청에서 파일을 저장 한 다음 두 번째 요청에서 파일에 액세스 할 수있는 것에 의존하지 마십시오.

+0

파일 이름없이 새우를 사용하여 메모리에 렌더링하는 방법에 대한 다른 설명을 참조하십시오. – kwerle

5

오래전에 답변을 받았지만이를 원할 수도있는 다른 사람들을 위해 게시하겠습니다.

현재 Prawn v0.13.2에서 파일 이름없이 render으로 전화 할 수도 있습니다. 문자열이 반환되며 send_data으로 클라이언트에 보낼 수 있습니다. 패턴은 다음과 같습니다.

pdf = Prawn::Document.new 
# ... calls to build the pdf 
send_data pdf.render, 
      type: 'application/pdf', 
      filename: 'download_filename.pdf', 
      disposition: :inline 

그러면 PDF가 브라우저에 표시됩니다. 대신 사용자가 다운로드하도록하려면 , disposition: :inline

을 생략하십시오. 물론 문서가 비교적 짧거나 사용자의 다운로드가 완료 될 때까지 RAM을 소비하기 때문에 시스템을 많이 사용하지 않는 경우에만이 작업을 수행하려고합니다.

+0

한 가지 도전은 Heroku가 부과 한 30 초 요청 제한 일 것 같습니다. 파일 처리가 30 초보다 오래 걸리면 응용 프로그램이 500으로 실패 할 가능성이 있습니다. – tamersalama

+0

@tamersalama 사실이긴하지만 OP의 원래 솔루션은 파일을 쓰고 읽는 것이 메모리에서 버퍼링. 나는 단지 파일 I/O를 피할 수 있음을 보여주었습니다. – Gene

+0

동의 - 그냥 당신의 답변에 언급했다 coz 나는 그것을 좋아한다 :) – tamersalama

관련 문제