我正在使用aws-sdk
gem来读取存储在AWS S3中的CSV文件。
引用AWS doc。到目前为止,我有:
Aws::S3::Resource.new.bucket(ENV['AWS_BUCKET_NAME']).object(s3_key).get({ response_target: "#{Rails.root}/tmp/items.csv" })
在Pry,这会返回:
output error: #<IOError: closed stream>
但是,导航到tmp/
。我可以看到items.csv
文件,它包含正确的内容。我不确定返回值是否是实际错误。
我的第二个问题。可以在"#{Rails.root}/tmp/"
中存储临时文件吗?
或者我应该考虑另一种方法?
我可以将文件加载到内存中,然后加载CSV.parse
。如果CSV文件很大,这会有影响吗?
答案 0 :(得分:1)
我不确定如何使用aws gem同步返回文件对象。
但我可以就你提到的其他话题提供一些建议。
首先,/ tmp - 我发现在这里保存文件是一种有效的方法。在AWS上,我使用此目录为S3存储的图像创建本地LRU缓存。关键是要抢占文件被自动删除的情况。如果发生这种情况,则需要重新获取该文件。顺便说一句,Heroku有一个只读文件系统&#39;但仍然允许你写入/ tmp。
第二部分是同步返回文件对象的问题。
虽然可以使用S3 gem来实现这一点,但我发现使用open-uri
或mechanize
之类的内容通过HTTP获取成功。如果它不应该是公开可用的资产,您可以更改S3上的权限以限制对服务器的访问。