Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将临时文件写入二进制文件_Ruby On Rails_Ruby_Ruby On Rails 5 - Fatal编程技术网

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