2016-01-27 4 views
1

У меня есть действие контроллера, которое предоставляет PDF-файл для загрузки. Я хочу сделать несколько PDF-файлов в папку TMP (затем пронестись их для скачивания)Рельсы визуализируют несколько файлов PDF в папку

я могу генерировать ПРВ и представить пользователю, но я не могу понять, как создать папку для хранения их.

Я использую креветку. У него есть метод render_file, чтобы сохранить его в файловой системе, но я не знаю, в каком каталоге он находится, или если другие пользователи могут сохранить свои pdf-файлы в одной и той же папке, поэтому мне нужно создать папку для каждого пользователя, а затем сохранить pdf-файл там ,

Как я могу это сделать?

мои действия контроллера в настоящее время

def showpdf 
    respond_to do |format| 
     format.html 
     format.pdf do 
     @items.each do |pdf| 
      pdf = Prawn::Document.new(page_size: "A4",margin: [0,0,0,0]) 

     # pdf creation stuff... 

      # this was used previously to render one pdf to the browser 
      # but I need to save multiple pdf's 
      #send_data pdf.render, filename: 'report.pdf', type: 'application/pdf' 
     end 
     end 
    end 
+0

Похоже, вам нужна какая-то комбинация Dir.mktmpdir или Tempfile.new в зависимости от того, как вы будете проходить через файлы и передавать их в утилиту zip. – depquid

+0

@depquid вот что я прошу ... –

ответ

2

Вам нужно будет хранить все файлы в TMP папку/ваша папка, что-то вроде этого

require 'prawn' 
@items.each do |item| 
    pdf = Prawn::Document.new 
    pdf.text("Lets Zip All.") 
    pdf.render_file('tmp/your-folder/#{item.id}.pdf') 
end 

, а затем просто использовать https://github.com/rubyzip/rubyzip, чтобы заархивировать ваши -folder.

require 'zip' 
folder = "tmp/your-folder/" 
zipfile_name = "tmp/archive.zip" 

input_filenames = Dir.entries("tmp/your-folder/").select {|f| !File.directory? f} 

Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile| 
    input_filenames.each do |filename| 
    zipfile.add(filename, folder + '/' + filename) 
end 

zipfile.get_output_stream("myFile") { |os| os.write "myFile contains just this" } 
end 

Просто отправьте файл пользователю. Но если PDF содержит много данных, переместите их на замедленные задания. Надеюсь, что это имеет смысл, но если нет, пожалуйста, ответьте.

+0

спасибо, но последний раздел, похоже, не работает, строка 'zipfile.add (имя файла, папка + '/' + имя_файла)' выдает ошибку 'No такой файл или каталог @ rb_file_s_lstat -/myfilename.pdf', это правильный способ вставить папку и имя файла в путь? –

+0

ему нужно было 'File.join (папка, имя_файла)' как представить zip-файл для загрузки сейчас, когда он сгенерирован? –

+0

ответить на мой последний вопрос 'send_file (File.join (папка, 'archive.zip'),: type => 'application/zip',: filename => 'archive.zip')' –

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