之前我在Ruby 1.8.7中使用过rubyzip gem,但我听说rubyzip与ruby 1.9.2不兼容.
什么zip库与Ruby 1.9.2一起使用?
我正在编写可以读取/写入 Excel xlsx 文件的代码。xlsx 文件只是几个 xml 文件的 zip 存档,因此为了测试我是否可以编写文件,我使用了一个名为 gem 的 gemrubyzip来解压缩 xlsx 文件,然后立即将其压缩回新存档,而不修改数据。然而,当我这样做时,我无法打开新的 Excel 文件,据说它已损坏。
或者,如果我使用 Mac OS X 的 Archive Utility(处理 zip 文件的本机应用程序),并且解压缩并重新压缩 Excel 文件,则数据不会损坏,并且我可以在 Excel 中打开生成的文件。
我发现rubyzip“损坏”数据的不是“解压缩”功能,而是压缩过程。(事实上,当我对rubyzip创建的新 zip 文件使用 Archive Utility 时,Excel 再次可以读取该文件)。
我想知道为什么会发生这种情况,以及有哪些解决方案可以以 Excel 可读的方式以编程方式压缩内容。
我的压缩代码:
def compress(path)
path.sub!(%r[/$],'')
archive = File.join(path,File.basename(path))+'.zip'
FileUtils.rm archive, :force=>true
Zip::ZipFile.open(archive, 'w') do |zipfile|
Dir["#{path}/**/**"].reject{|f|f==archive}.each do |file|
temp = file
zipfile.add(file.sub(path+'/',''),file)
end
end
end
Run Code Online (Sandbox Code Playgroud) 我正在使用 Rails 5.2 和 ActiveStorage 让我的用户在我的应用程序中上传文件。我将所有上传的文件显示在表格中,我可以选择要下载的文件。选择后,我将能够以 zip 文件形式下载所有这些内容。为了压缩文件,我使用 Rubyzip,但无法正常工作。
我尝试了两种方法:
1 - 我尝试了这种方法并遇到了此错误
No such file or directory @ rb_sysopen - /rails/active_storage/blobs/..../2234.py
这是我的控制器:
def batch_download
if params["record"].present?
ids = params["record"].to_unsafe_h.map(&:first)
if ids.present?
folder_path = "#{Rails.root}/public/downloads/"
zipfile_name = "#{Rails.root}/public/archive.zip"
FileUtils.remove_dir(folder_path) if Dir.exist?(folder_path)
FileUtils.remove_entry(zipfile_name) if File.exist?(zipfile_name)
Dir.mkdir("#{Rails.root}/public/downloads")
Record.where(id: ids).each do |attachment|
open(folder_path + "#{attachment.file.filename}", 'wb') do |file|
file << open("#{rails_blob_path(attachment.file)}").read
end
end
input_filenames = Dir.entries(folder_path).select {|f| !File.directory? f}
Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
input_filenames.each do |attachment|
zipfile.add(attachment,File.join(folder_path,attachment))
end
end
send_file(File.join("#{Rails.root}/public/", 'archive.zip'), …Run Code Online (Sandbox Code Playgroud) 对于我的 Ruby on Rails 项目(Rails 版本 5.1.2),我正在生成图像文件 (png) 并使用 RubyZip gem 将它们下载为 zip 文件。
图像文件不存储在任何目录中。我有一个名为附件的模型。每个附件都有一个属性 image_string,它是图像的 base64 字符串。您可以使用标签显示图像image_tag(src = "data:image/jpeg;base64, #{attachment.image_string}", style: "border-radius: 0;")
对于多个图像,我想为每个图像创建临时文件而不将它们存储在任何地方并将这些图像下载为 zip 文件。
我现在拥有的代码:
def bulk_download
require('zip')
::Zip::File.open("/tmp/mms.zip", Zip::File::CREATE) do |zipfile|
Attachment.all.each do |attachment|
image_file = Tempfile.new("#{attachment.created_at.in_time_zone}.png")
image_file.write(attachment.image_string)
zipfile.add("#{attachment.created_at.in_time_zone}.png", image_file.path)
end
end
send_file "/tmp/mms.zip", type: 'application/zip', disposition: 'attachment', filename: "my_archive.zip"
respond_to do |format |
format.all { head :ok, content_type: "text/html" }
end
end
Run Code Online (Sandbox Code Playgroud)
但是下载的zipfile里面没有文件,大小为0字节。提前致谢。