2011-11-10 7 views
2

私はImageというモデルを持っています。画像にはS3で保存されたDragonflyを使用してファイルが添付されています。RubyZipを使用してZipにリモートファイルを格納するRuby

私はすべての画像を圧縮する必要があります。

私が使用しています:

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

私はに実行している問題はimage_pathがローカルの場合、これが動作することです。ファイルのS3を呼び出す必要がある場合、image_pathhttp://example.s3.amazonaws.com/foo/image.jpgのようなリモートパスです。それを処理するRubyZipメソッドはないと思います。

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

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

ありがとうございます!

+0

net/httpを介してファイルをダウンロードし、一時ファイルを保存し、一時ファイルをzipに格納してから削除したカスタムメソッドmpファイル。 – Corey

答えて

1

自分自身の回答です。私のOPのコメントを参照してください。

+1

私は一時ファイルを追加せずにより良い答えを追加しました。 –

0

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

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

3

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

任意のリモートファイルを一時ファイルに保存せずにzipに追加してから、一時ファイルから読み込み、最終的に一時ファイルを削除することができます。

zipファイルを作成し、内部のtemp_zip上の任意のローカルファイルを追加したい場合、あなたは再びそれを開くことができ、それに

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

をリモートのファイルを追加します。もう一度、このzipファイルを開き、任意のローカルファイルを追加

をあなたが望む

関連する問題