2011-11-10 27 views
2

我有一個名爲Image的模型。圖像具有使用蜻蜓附件存儲在S3中的文件。Ruby使用RubyZip在Zip中存儲遠程文件

我有一個要求,我需要壓縮所有圖像。

我使用:

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

我遇到的問題是,這個工程如果image_path是本地的。當你需要調用S3來獲取文件時,image_path是一個遠程路徑,例如http://example.s3.amazonaws.com/foo/image.jpg,我不認爲有一個RubyZip方法可以處理這個問題。

我在寫一些東西,從遠程路徑創建臨時文件,將該臨時文件添加到zip,然後刪除臨時文件。

但在我這樣做之前,有沒有人知道RubyZip或其他一些壓縮類庫是否可以處理遠程文件的壓縮?還是有更好/更簡單的方法?

謝謝!

+0

我結束了自定義的方法,通過網絡/ http下載文件,保存臨時文件,將臨時文件放入zip,然後處置te mp文件。 – Corey

回答

1

回答我自己,看看我在OP中的評論。

+1

我添加了一個更好的答案,但不添加臨時文件。 –

0

一種選擇是在本地安裝s3。有許多方法可以像使用程序員一樣使用ftp來執行此操作,並且還有專門的程序。這取決於您正在運行的操作系統。

我沒有看到使用遠程URL通過zip流式傳輸zip的方法。

3

我面臨同樣的問題,我找到了解決方案。所以我分享它,可能會幫助某人。

您可以將任何遠程文件添加到壓縮文件,而不將其保存在臨時文件中,然後從臨時文件中讀取它,最後刪除臨時文件。

創建ZIP和它

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

如果你想添加的內部以上temp_zip任何本地文件,那麼你就可以再次打開它添加遠程文件:再次

打開這個壓縮並添加本地文件你想

zipfile = Zip::File.open(tmp_zip) 
zipfile.add("report.pdf", my_pdf_path) 
zipfile.close 
相關問題