5

圧縮後にウェブサイトから写真をダウンロードしたい。rubyZip gem を使用していますが、リモート ファイルを圧縮できません。シナリオは次のとおりです。

サーバーからコンテンツを圧縮しようとしています。内容はこんな感じ

http://myApplication.s3.amazonaws.com/xxxxxxxx/image/image1.jpeg

したがって、「zipfile.add(attachment.document_file_name, attachment.document.url)」では、次の値を割り当てました。

document_file_name = image1.jpeg/image2.jpeg/image3.jpeg document.url = http://myApplication.s3.amazonaws.com/xxxxxxxx/image

ここで、次のエラーが発生します。

そのようなファイルまたはディレクトリはありません - myApplication.s3.amazonaws.com/xxxxxxxx/image

ローカル ファイル システム (例: /home/user/images) からファイルを圧縮した場合、この gem は正常に機能しますが、リモート ファイルでは機能しません。

私は何か間違ったことをしていますか?誰かが私を助けることができますか?または、これを行うことができる他の宝石はありますか?

ありがとう、 -タニヤット

4

1 に答える 1

9

できることは、最初にs3から読み取り、アーカイブファイルに直接書き込み(アーカイブファイルを一時ディレクトリに置く)、それを提供してから一時アーカイブファイルを削除することです。ここに小さなスニペットがあります:

  require 'zip/zip'

  s3 = Aws::S3.new(S3_KEY, S3_SECRET)
  bucket_gen = Aws::S3Generator::Bucket.create(s3, S3_BUCKET)
  archive_file = "#{Rails.root}/tmp/archive.zip"

  Zip::ZipOutputStream.open(archive_file) do |zos|
    list_of_files_to_loop.each do |file|
      filename = file.filename
      url = "#{S3_PATH}/#{filename}"

      signed_url = bucket_gen.get(URI.unescape(URI.parse(URI.escape(url)).path[1..-1]), 1.minute)

      zos.put_next_entry(filename) # Give it next file a filename
      zos.print(URI.parse(signed_url).read) # Add file to zip
    end
  end # Write zip file

  # TODO: Serve file
  # TODO: Delete archived file from tmp directory

参考: http: //rubyzip.sourceforge.net/classes/Zip/ZipOutputStream.html

于 2013-04-08T08:31:46.197 に答える