我在 AWS S3 中有一个 CSV 文件,我试图在本地临时文件中打开它。这是代码:
s3 = Aws::S3::Resource.new
bucket = s3.bucket({bucket name})
obj = bucket.object({object key})
temp = Tempfile.new('temp.csv')
obj.get(response_target: temp)
它从 AWS 中提取文件并将其加载到一个名为“temp.csv”的新临时文件中。对于某些文件,该obj.get(..)
行会引发以下错误:
WARN: Encoding::UndefinedConversionError: "\xEF" from ASCII-8BIT to UTF-8
WARN: /Users/.rbenv/versions/2.5.0/lib/ruby/2.5.0/delegate.rb:349:in `write'
/Users/.rbenv/versions/2.5.0/lib/ruby/2.5.0/delegate.rb:349:in `block in delegating_block'
/Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/aws-sdk-core-3.21.2/lib/seahorse/client/http/response.rb:62:in `signal_data'
/Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/aws-sdk-core-3.21.2/lib/seahorse/client/net_http/handler.rb:83:in `block (3 levels) in transmit'
...
/Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/aws-sdk-s3-1.13.0/lib/aws-sdk-s3/client.rb:2666:in `get_object'
/Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/aws-sdk-s3-1.13.0/lib/aws-sdk-s3/object.rb:657:in `get'
Stacktrace 显示错误最初是由.get
适用于 Ruby 的 AWS 开发工具包引发的。
我尝试过的事情:
将文件(对象)上传到 AWS S3 时,您可以指定content_encoding
,因此我尝试将其设置为 UTF-8:
obj.upload_file({file path}, content_encoding: 'utf-8')
此外,当您打电话时,.get
您可以设置response_content_encoding
:
obj.get(response_target: temp, response_content_encoding: 'utf-8')
这些都不起作用,它们会导致与上述相同的错误。我真的希望这样做可以解决问题。在 AWS S3 仪表板中,我可以看到确实通过代码正确设置了内容编码,但它似乎没有任何区别。
当我在上面的第一个代码片段中执行以下操作时,它确实有效:
temp = Tempfile.new('temp.csv', encoding: 'ascii-8bit')
但我更喜欢使用正确的编码从 AWS S3 上传和/或下载文件。有人可以解释为什么在临时文件上指定编码有效吗?或者如何通过 AWS S3 上传/下载使其工作?
需要注意的重要一点:错误消息中的问题字符似乎只是在我正在使用的这个自动生成的文件的开头添加的随机符号。我不担心正确读取字符,无论如何解析文件时它都会被忽略。