【发布时间】:2017-08-25 22:58:48
【问题描述】:
我有一个应用程序,用户可以在其中上传持久保存到 S3 的基于文本的文件(xml、csv、txt)。其中一些文件非常大。需要对这些文件中的数据执行各种操作,因此我没有从 S3 读取它们并偶尔超时,而是将文件下载到本地,然后对它们进行松散的操作。
这是我用来从 S3 下载文件的代码。 Upload 是我用来存储此信息的 AR 模型的名称。该方法是 Upload 模型上的实例方法:
def download
basename = File.basename(self.text_file_name.path)
filename = Rails.root.join(basename)
host = MyFitment::Utility.get_host_without_www(self.text_file_name.url)
Net::HTTP.start(host) do |http|
f = open(filename)
begin
http.request_get(self.text_file_name.url) do |resp|
resp.read_body do |segment|
f.write(segment) # Fails when non-ASCII 8-bit characters are included.
end
end
ensure
f.close()
end
end
filename
end
所以你会看到上面加载失败的那一行。此代码以某种方式认为所有下载的文件都以 ASCII 8 位编码。我该怎么做:
1) 像这样检查远程文件的编码 2) 下载并写入成功。
这是当前特定文件发生的错误:
Encoding::UndefinedConversionError: "\x95" from ASCII-8BIT to UTF-8
from /Users/me/code/myapp/app/models/upload.rb:47:in `write'
感谢您提供的任何帮助!
【问题讨论】:
标签: ruby encoding amazon-s3 character-encoding net-http