我有一个名为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库处理压缩远程文件吗?还是有更好/更简单的方法?
谢谢!
我遇到过同样的问题,我已经找到了一个解决方案。所以我把它分享给大家,也许能帮到别人。
您可以将任何远程文件添加到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
上面添加任何本地文件,那么你可以再次打开它:
再次打开此压缩文件并添加所需的任何本地文件
zipfile = Zip::File.open(tmp_zip)
zipfile.add("report.pdf", my_pdf_path)
zipfile.close
一种选择是本地挂载s3。有很多方法可以使用ftp,比如程序员,也有专门的程序。这也取决于你运行的操作系统。
我没有看到使用远程URL通过zip传输压缩的方法。