Использование креветок на Heroku - PullRequest
10 голосов
/ 13 марта 2012

В настоящее время мы работаем над приложением Rails, размещенным на Heroku.Мы пытаемся сгенерировать PDF и отправить его пользователю для загрузки.

Мы используем Prawn для обработки создания PDF.

Наш код для создания PDF в настоящее время:

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

Далее следует весь наш код для генерации документа.К сожалению, это сохраняет документ на диск, что невозможно (насколько мне известно) для приложений, размещенных на Heroku.

Затем мы отправляем его пользователю, используя

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

Есть ли способ использовать Prawn для прямой загрузки документа пользователю без предварительного сохранения документа на диск?Если нет, есть ли другие камни для создания PDF-файлов, которые не требуют сохранения файла на диск перед отправкой файла?

Ответы [ 2 ]

8 голосов
/ 13 января 2014

Несмотря на то, что на это уже давно ответили, я буду публиковать сообщения для тех, кто может захотеть это сделать.

Вы также можете вызвать render без имени файла в текущей Prawn v0.13.2.Будет возвращена строка, которую можно отправить клиенту с помощью 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

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

7 голосов
/ 13 марта 2012

В Aspen / Bamboo вы можете сохранить файл на диск в каталоге tmp/ в каталоге вашего приложения (возможно, Rails.root.join("tmp")) или в любом подкаталоге.

В Cedar вы можете сохранить файл вдиск в любом месте в каталоге вашего приложения, но вы все равно должны выбрать подкаталог каталога вашего приложения tmp/.

В любом случае сохраненные файлы являются эфемерными.Они не распределяются между двумя запущенными экземплярами вашего приложения;они не хранятся между перезапусками;и т. д. Не полагайтесь на сохранение файла в одном запросе, а затем на доступ к нему во втором запросе.

...