2012-03-12 4 views
9

В настоящее время мы работаем над приложением Rails, размещенным на Heroku. Мы пытаемся создать PDF-файл и нажимаем его на пользователя для загрузки.Использование креветки на 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")) или в любом подкаталоге.

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

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

+0

См. Другой комментарий об использовании креветки без имени файла для рендеринга в памяти. – kwerle

5

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

Вы также можете позвонить по номеру 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-файл в браузере. Если вы хотите, чтобы пользователь загрузил его, пропустите

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

+0

Я предполагаю, что одним вызовом может быть ограничение на 30 секунд, наложенное Heroku. Если обработка файлов занимает более 30 секунд - есть вероятность, что приложение завершится с ошибкой 500. – tamersalama

+0

@tamersalama Хотя это правда, оригинальное решение OP было бы неудачно по этой причине до этого, потому что запись, а затем чтение файла происходит медленнее, чем буферизации в памяти. Я просто показывал, что можно избежать ввода/вывода файла. – Gene

+0

согласен - просто комментировал ваш ответ coz Мне это нравится :) – tamersalama

Смежные вопросы