2013-04-14 50 views
1

我的目标是根据用户上传到Amazon S3的excel文件中的数据生成图表。通过Rails访问存储在Amazon S3中的数据

我已经实现了用户使用Carrierwave上传excel文件的功能,现在我需要能够访问这些数据并使其可以用于图表库(Highcharts)。

我坚持的任务是通过Rails直接访问S3中的数据。一旦数据被拉出,使用Highcharts对其进行操作应该相当简单。

任何建议将不胜感激!

回答

2

可以使用AWS SDK

require 'aws-sdk' 

# retrieve the access key and secret key 
access_key_id = ENV["ACCESS_KEY_ID"] 
secret_access_key = ENV["SECRET_ACCESS_KEY"] 

# create an instance of the s3 client 
s3 = AWS::S3.new(access_key_id: access_key_id, secret_access_key: secret_access_key) 

# get the bucket 
bucket = s3.buckets['your-bucket-name'] 

# retrieve the objects 
bucket.objects.each do |object| 
    puts object.key 
    puts object.read 
end 
+0

另外,会有安全隐患直接将访问密钥信息到函数? – Anconia

+0

对不起,我没有发布一个完整的实现。你是对的;你不应该把你的密钥直接放在代码中。我通常[将它们粘在一个环境变量中](http://stackoverflow.com/a/11300680/262125)。我会更新我的答案。 – LandonSchropp

0
s3 = Aws::S3::Client.new 
bucket = Aws::S3::Bucket.new('AWS_BUCKET NAME HERE') 
bucket.objects.each do |obj| 
    File.open("#{Rails.root}/#{obj.key}", 'wb') do |file| 
    s3.get_object(bucket:ENV[:AWS_BUCKET], key: obj.key , response_target: file) 
    end 
end 

OR

s3 = Aws::S3::Client.new 
s3.list_objects(bucket: 'AWS_BUCKET NAME HERE').each do |response| 
    response.contents.each do |obj| 
    File.open("#{Rails.root}/#{obj.key}", 'wb') do |file| 
     s3.get_object(bucket: 'AWS_BUCKET NAME HERE', key: obj.key , response_target: file) 
    end 
    end 
end 

有官方AWS-SDK RUBY宝石

AWS SDK ruby official documentation for version 2

对于环境变量配置,您可以figarodotenv (for development environment)或设置为〜/ .bashrc文件。

注:

  1. 您需要创建S3存储和获取AWS_ACCESS_KEY_I d和AWS_SECRET_ACCESS_KEY
  2. 发展之前,你可以测试和使用google chrome s3 browser extenstion
  3. 运行命令源的〜/ .bashrc访问您的S3存储数据。 〜/ .bashrc文件以反映更改,如果您在那里存储ENV变量。

Code Reference