首页 > 解决方案 > TarWriter 抛出 Gem::Package::TarWriter::FileOverflow

问题描述

我想从一堆文件中生成一个 tar。

out_file = File.new('some.tar', 'w')
tar = Gem::Package::TarWriter.new out_file
attachments = #Array of attachment objects
attachments.each{|a|
   file = Attachment.new(a).read_file #returns a String
   file.force_encoding('UTF-8')
   tar.add_file_simple( a[:filename], 777, file.length) do |io|
      io.write(file)
    end
}

Gem::Package::TarWriter::FileOverflow - 您尝试提供的数据超出文件的容量。

有谁知道为什么会发生这种情况以及如何解决它?

标签: ruby-on-railsrubytar

解决方案


String#length返回字符串中的字符数。由于 UTF-8 字符可以用多个字节表示,因此字符串的字节大小通常更大。

现在TarWriter期望文件大小以字节为单位。因此,如果您在文件中使用纯 ascii 字符以外的任何内容,它将溢出。

为了解决这个问题,您应该因此传递file.bytesizeadd_file_simple方法而不是file.size.


推荐阅读