TL;DR
我该如何指定File.write上的编码模式,或者如何以类似的方式将图像二进制文件保存到文件中?
更多详细信息
我正在尝试从Trello卡下载一个图像,然后将该图像上传到S3,这样它就有了一个可访问的URL。我已经能够从Trello下载二进制图像(我相信这是某种形式的二进制图像),但我在使用File.write
将其保存为.jpeg
时遇到了问题。每次我尝试这样做时,它都会在我的Rails控制台中给我这个错误:
Encoding::UndefinedConversionError: "xFF" from ASCII-8BIT to UTF-8
from /app/app/services/customer_order_status_notifier/card.rb:181:in `write'
这是触发的代码
def trello_pics
@trello_pics ||=
card.attachments.last(config_pics_number)&.map(&:url).map do |url|
binary = Faraday.get(url, nil, {'Authorization' => "OAuth oauth_consumer_key="#{ENV['TRELLO_PUBLIC_KEY']}", oauth_token="#{ENV['TRELLO_TOKEN']}""}).body
File.write(FILE_LOCATION, binary) # doesn't work
run_me
end
end
所以我认为这一定是File.write将输入转换为文件的方式的问题。是否有指定编码的方法?
AFIK不能在执行write
时执行,但可以在创建File
对象时执行;这里有一个UTF8编码的例子:
File.open(FILE_LOCATION, "w:UTF-8") do
|f|
f.write(....)
end
另一种可能性是使用external_encoding
选项:
File.open(FILE_LOCATION, "w", external_encoding: Encoding::UTF_8)
当然,这假设所写入的数据是String
。如果您有(打包的)二进制数据,您将使用"wb"
打开文件,并使用syswrite
而不是write
将数据写入文件。
UPDATE正如enginesmnky在评论中指出的,编码的参数也可以作为参数传递给write
方法本身,例如
IO::write(FILE_LOCATION, data_to_write, external_encoding: Encoding::UTF_8)