0

我一直在使用rubyzipzip/unzip 来压缩从 20MB 到 1GB 的文件/文件夹。我注意到在压缩 20MB 的文件夹后,创建的 zipfile 的大小几乎相同,大约为 20MB。所以rubyzip只是压缩文件或实际压缩它因为压缩文件必须小于实际文件大小的 40%-50%。我什至尝试使用system(zip, archive, Dir["#{path}/**/**"]),但我想我无法获得正确的语法来调用它。所以我的问题是

  1. 为什么rubyzip无法创建大小也必须更小的实际 zi​​p 文件。
  2. 对于超过 500MB 的 zip 文件,我如何使用 send_file 将其发送到客户端,因为对于该大小的文件,它会带来成本性能问题。如果我将 500MB 或以上的 zip 放在公共文件夹中并让服务器服务会怎样它可能会提高性能,我正确吗?
  3. 有没有其他选择而不是使用rubyzip/zipruby(这也需要库)。

我正在使用 ruby​​ 1.9 和 rails 2.3。

我的代码:-

require 'zip/zip'
require 'fileutils'
require 'zip/zipfilesystem'


def self.compress_test(path)

    path="#{RAILS_ROOT/answers/}"  
     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|
             begin  
                 zipfile.add(file.sub(path+'/',''),file)   
             rescue Zip::ZipEntryExistsError
             end
       end
     end
 end
4

1 回答 1

1

为什么 ruby​​zip 无法创建一个必须更小的实际 zi​​p 文件。

这取决于您要压缩的文件。文本和 xls 文件将压缩得相当好。JPEG、PNG、MPEG 等格式的媒体文件已经在内部进行了压缩,并且通常获得 99% 的压缩率。它们通常比同一文件夹中的其他文件要大,因此压缩包含一些图像、文本和电子表格的文件夹的结果似乎不会小很多。压缩.zip文件甚至可以使最终结果比您开始时更大。

对于超过 500MB 的 zip 文件,我如何使用 send_file 将其发送到客户端,因为对于该大小的文件,它会带来成本性能问题。如果我将 500MB 或以上的 zip 放在公共文件夹中并让服务器服务会怎样它可能会提高性能,我正确吗?

是的,将大文件保存到磁盘并让 Web 服务器发送它可能更有效。最简单的做法是将文件保存到可以从中获取文件的文件夹中,并提供链接。您还可以从不同的服务器(例如,专门用于提供大文件的 lighttpd 实例)来避免加载您的应用程序服务器。

有一些设置允许您将控制权从 Ruby 进程传回给例如 Apache(xsendfile这是我所知道的),但设置将是一个不同的问题,这取决于您拥有的 Web 服务器,以及您是否有安全问题.

除了使用 ruby​​zip/zipruby(也需要库)之外,还有其他选择吗?

可能是的,但是您不太可能通过更改您正在使用的 gem 来找到其他两个问题的解决方案,因为rubyzip在这里做得很合理 - 它没有失败。

于 2013-09-27T08:00:04.260 回答