我正在使用一个 api,它在 http 响应的正文内容中回复一个 zip 文件。我可以使用 zip-ruby wiki ( https://bitbucket.org/winebarrel/zip-ruby/wiki/Home )中的示例解压缩文件并将每个文件写入磁盘:
Zip::Archive.open('filename.zip') do |ar| # except I'm opening from a string in memory
ar.each do |zf|
if zf.directory?
FileUtils.mkdir_p(zf.name)
else
dirname = File.dirname(zf.name)
FileUtils.mkdir_p(dirname) unless File.exist?(dirname)
open(zf.name, 'wb') do |f|
f << zf.read
end
end
end
end
但是,我不想将文件写入磁盘。相反,我想创建一个活动记录对象,并设置一个回形针文件附件:
asset = Asset.create(:name => zf.name)
asset.file = open(zf.name, 'r')
asset.save
奇怪的是第一个示例中的 open 语句将文件写入磁盘始终如一地工作。但是,当我只想将 zf (Zip::File) 作为内存中的通用文件打开时,有时会得到:
*** Errno::ENOENT Exception: No such file or directory - assets/somefilename.png
如何将 Zip::File zipruby 创建的文件分配给回形针文件而不出现此错误?