1

Ruby on Rails でいくつかのファイルを圧縮し、zip ファイルを tmp フォルダーに保存したいと考えています。アップローダが関連付けられた名前フィールドを持つドキュメント モデルがあります。また、Carrierwave を使用してファイルを Amazon S3 にアップロードしています。私は次のコードを持っています:

class Document < ActiveRecord::Base

  mount_uploader :name, DocumentUploader
  ...

end


def create_zip  
  documents = Document.all
  folder = "#{Rails.root}/tmp"
  tmp_filename = "#{folder}/export.zip"

  zip_path = tmp_filename
  Zip::ZipFile::open(zip_path, true) do |zipfile|
    documents.each do |photo|
      zipfile.get_output_stream(document.name.identifier) do |io|
        io.write document.name.file.read
      end
    end
  end

end

これにより、tmp フォルダーに export.zip ファイルが作成されますが、それを開こうとすると、アーカイブ マネージャー (Mac OS X) がアーカイブの解凍を開始しますが、終了せずに解凍を続けます。私のコードには何かが欠けていると思います。zipファイルのサイズは私には理にかなっていますが、その問題があります。何かご意見は?ありがとう!

4

1 に答える 1

0

実際、他のプログラム (zipeg) を使用して zip ファイルを開くことができることがわかりました。ただし、ドキュメント配列の最後のファイルのみが圧縮ファイルに含まれていました。すべての場合で、残っている唯一のファイルが同じ(エクスポート、zip自体の名前と同じ)と呼ばれていたため、以前のファイルを上書きしていたと思います。

以下のコードは私にとってはうまくいきます:

def create_zip
  documents = Document.all

  folder = "#{Rails.root}/tmp"
  tmp_filename = "#{folder}/export.zip"
  zip_path = tmp_filename

  Zip::ZipOutputStream.open(zip_path) do |zos|
    documents.each do |document|
      path = document.name_identifier
      zos.put_next_entry(path)
      zos.write photo.name.file.read
    end
  end
end
于 2013-01-31T21:34:19.887 に答える