ruby-on-rails - 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 - 您尝试提供的数据超出文件的容量。
有谁知道为什么会发生这种情况以及如何解决它?
解决方案
String#length
返回字符串中的字符数。由于 UTF-8 字符可以用多个字节表示,因此字符串的字节大小通常更大。
现在TarWriter
期望文件大小以字节为单位。因此,如果您在文件中使用纯 ascii 字符以外的任何内容,它将溢出。
为了解决这个问题,您应该因此传递file.bytesize
给add_file_simple
方法而不是file.size
.
推荐阅读
- java - Java Arraylist.retainAll() 返回意外的空列表
- python - 如何使用 numba 加速具有不同维度向量的 numpy.ndarray?
- javascript - 如何使用 serviceWorker 缓存 ajax 响应
- python - 与表单在同一页面上输出
- javascript - HTML / JS 下拉菜单按钮不会放在 Android Studio WebView 中
- android - 如何在适配器的底部工作表片段中设置 TextView 占位符
- laravel - LaravelCollective/html 转义不一致与双花括号
- python - 如何遍历模型并将其显示在django的modeladmin上?
- python - 如何在python中取消或暂停一个urllib请求
- electron - net:ERR_CONNECTION_RESET 来自电子应用程序中的特定网站