Rails: Как я могу использовать системный zip на Heroku для создания документа из xml-шаблона? - PullRequest
2 голосов
/ 21 июня 2011

У меня это работает локально, сохраняя файлы шаблонов в #{Rails.root}/tmp, используя system "cd tmp/template; zip -r ../#{@filename} *" для архивирования файлов, отправляя .docx (zip-архив) на S3, а затем в браузер. Проблема в том, что Heroku не находит файлы. Перед созданием файла XML я копирую каталог шаблонов из другого места (system "cp -R support/ser_template tmp/"). Я понимаю, что файловая система Heroku * только для чтения , но я не могу пометить имена файлов #{Process.pid} (Word требует, чтобы файл xml был назван document.xml).

Могу ли я в любом случае хранить файлы шаблонов на Amazon и все еще использовать системную zip-утилиту Heroku? RubyZip не создает надлежащие архивы docx .

Редактировать: вот код:

require 'aws/s3'

class WordDocument
  include ConnectS3

  def initialize(content)
    connect_s3
    @pid = Process.pid
    @filename = "SER_" + Time.now.strftime("%Y%m%d-%H%M%S") + '.docx'
    system "cp -R #{Rails.root}/support/ser_template #{temp_path}"
    xml = File.open(xml_path, 'w')
    xml.puts content
    xml.close
    system "cd #{temp_path}; zip -r #{@filename} *"
    docx = File.open(temp_path + "/" + @filename, 'r')
    AWS::S3::S3Object.store(s3_path, docx, @s3_credentials["bucket"], :use_virtual_directories => true)
    AWS::S3::S3Object.grant_torrent_access_to s3_path, @s3_credentials["bucket"]
  end

  def temp_path
    "#{Rails.root}/tmp/#{@pid}_ser"
  end

  def xml_path
    temp_path + "/word/document.xml"
  end

  def path
    "https://s3.amazonaws.com/" + @s3_credentials["bucket"] + s3_path
  end

  def s3_path
    '/section_editor_reports/' + @filename
  end
end

1 Ответ

3 голосов
/ 21 июня 2011

Разве вы не можете просто создать каталог внутри #{Rails.root}/tmp с именем, скажем, #{Process.pid}_docx/something_nice/? Скопируйте (или символическую ссылку) то, что вам нужно, в:

#{Rails.root}/tmp/#{Process.pid}_docx/something_nice/

Тогда

system "cd #{Rails.root}/tmp/#{Process.pid}_docx/; zip -r x.zip something_nice"

И тогда у вас есть:

#{Rails.root}/tmp/#{Process.pid}_docx/x.zip

С красивой симпатичной внутренней структурой, в которую не входит ваш PID.

...