Ruby on rails 如何将临时文件写入二进制文件
尝试通过执行以下操作将字符串/解压缩文件写入时:Ruby on rails 如何将临时文件写入二进制文件,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,尝试通过执行以下操作将字符串/解压缩文件写入时: temp_file = Tempfile.new([name, extension]) temp_file.write(unzipped_io.read) 当我对图像执行此操作时,会引发以下错误: Encoding::UndefinedConversionError - "\xFF" from ASCII-8BIT to UTF-8 在研究它时,我发现这是因为Ruby在默认情况下试图使用编码(UTF-8)来编写文件。但是该文件应该以二进制形式
temp_file = Tempfile.new([name, extension])
temp_file.write(unzipped_io.read)
当我对图像执行此操作时,会引发以下错误:
Encoding::UndefinedConversionError - "\xFF" from ASCII-8BIT to UTF-8
在研究它时,我发现这是因为Ruby在默认情况下试图使用编码(UTF-8)来编写文件。但是该文件应该以二进制形式编写,因此它会忽略任何特定于文件的行为
定期写作,您可以按照以下方式进行:
File.open('/tmp/test.jpg', 'rb') do |file|
file.write(unzipped_io.read)
end
如何在
Tempfile
中实现这一点我在一篇旧的Ruby论坛帖子中遇到了这个解决方案,因此我想在这里分享一下,让人们更容易找到:
显然Tempfile
有一个未记录的方法binmode
,它将写入模式更改为二进制,从而忽略任何编码问题:
temp_file = Tempfile.new([name, extension])
temp_file.binmode
temp_file.write(unzipped_io.read)
感谢2007年在ruby-forums.com上提到它的陌生人 另一种选择是
IO.binwrite(路径、文件\u内容)
Tempfile.new
将接受的选项传递给它,特别是:
:binmode如果该值是真值,则与参数
模式中的“b”相同
因此,要以二进制模式打开tempfile,可以使用:
temp_file = Tempfile.new([name, extension], binmode: true)
temp_file.binmode? #=> true
temp_file.external_encoding #=> #<Encoding:ASCII-8BIT>
从文档中的“[…]实际上可以调用Tempfile对象上的任何文件实例方法”,在“方法”列表中,搜索binmode
没有结果。我现在看到了我的问题。我只查看了1个深度,希望在中找到我的方法,但我应该查看文件继承的下一个深度
Tempfile.create([name, extension], binmode: true) do |temp_file|
temp_file.write(unzipped_io.read)
# ...
end