2

Image というモデルがあります。画像には、S3 に保存されている Dragonfly を使用して添付されたファイルがあります。

すべての画像を圧縮する必要があるという要件があります。

私は使用しています:

 Zip::ZipFile.open(tmp_zip, Zip::ZipFile::CREATE) do |zipfile|
   zipfile.add("image.jpg", image_path)      
 end

私が直面している問題は、これimage_pathがローカルの場合に機能することです。ファイルのために S3 を呼び出す必要がある場合は、 http://example.s3.amazonaws.com/foo/image.jpgimage_pathなどのリモート パスであり、それを処理する RubyZip メソッドはないと思いますそれ。

リモートパスから一時ファイルを作成し、その一時ファイルをzipに追加してから一時ファイルを削除するものを書くことについて議論しています。

しかし、それを行う前に、RubyZip やその他の zip ライブラリがリモート ファイルの圧縮を処理するかどうかを知っている人はいますか? または、より良い/より簡単な方法はありますか?

ありがとう!

4

2 に答える 2

4

私は同じ問題に直面しており、解決策を見つけました。だから私はそれを共有しています、誰かを助けるかもしれません。

任意のリモート ファイルを一時ファイルに保存せずに zip に追加し、一時ファイルから読み取り、最後に一時ファイルを削除できます。

zip を作成し、その中にリモート ファイルを追加します。

Zip::OutputStream.open(tmp_zip) do |zos|
   zos.put_next_entry("image.jpg")
   zos.print(URI.parse(image_url).read)    
 end

上記の内部にローカル ファイルを追加する場合temp_zipは、再度開くことができます。

このzipを再度開き、必要なローカルファイルを追加します

zipfile = Zip::File.open(tmp_zip)
zipfile.add("report.pdf", my_pdf_path)
zipfile.close
于 2016-04-15T10:38:13.850 に答える
0

1 つのオプションは、s3 をローカルにマウントすることです。プログラマーのような ftp を使用してこれを行うにはさまざまな方法があり、専用のプログラムもあります。実行しているOSにも依存します。

リモート URL を使用して zip 経由で zip をストリーミングする方法がわかりません。

于 2011-11-11T00:23:46.970 に答える