Ruby使用RubyZip在Zip中存储远程文件

时间:2011-11-10 23:15:18

标签: ruby-on-rails ruby amazon-s3 zip rubyzip

我有一个名为Image的模型。图像具有使用Dragonfly附加的文件,存储在S3中。

我要求我需要压缩所有图像。

我正在使用:

 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或其他一些zip库是否会处理压缩远程文件?或者有更好/更简单的方法吗?

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

一种选择是在本地安装s3。有很多方法可以像使用ftp这样的程序来执行此操作,并且还有专门的程序。这取决于你正在运行的操作系统。

我没有看到使用远程网址通过zip流式传输zip的方法。