Seahorse :: Client :: NetworkingError使用rails上传Amazon S3文件

在我的rails 4应用程序中,我正在尝试下载,然后使用aws-sdk(使用gem 'aws-sdk', '~> 2' )将常规png文件上传到我的s3存储桶。

在开发环境中,代码完全正常。 但是如果我尝试使用rails s -e production或者如果我测试了我的heroku实例上的上传,那么当我测试图像上传function时,我会收到以下错误:

 Seahorse::Client::NetworkingError (Connection reset by peer): app/helpers/aws_s3.rb:73:in `upload_to_s3' app/controllers/evaluations_controller.rb:19:in `test' 

我在跟踪中提到的upload_to_s3方法如下所示:

 def upload_to_s3(folder_name) url = "http://sofzh.miximages.com/ruby-on-rails/WKeQQox.png" filename = "ss-" + DateTime.now.strftime("%Y%d%m-%s") + "-" + SecureRandom.hex(4) + ".png" full_bucket_path = Pathname(folder_name.to_s).join(filename).to_s file = save_to_tempfile(url, filename) s3 = Aws::S3::Resource.new(access_key_id: ENV["IAM_ID"], secret_access_key: ENV["IAM_SECRET"], region: 'us-east-1') s3_file = s3.bucket(ENV["BUCKET"]).object(full_bucket_path) s3_file.upload_file(file.path) raise s3_file.public_url.to_s.inspect end 

两个环境之间的环境变量是相同的。 我真的不知道还有什么地方可以调试这个。 为什么它会在开发中起作用,而不是在生产中起作用? 我有一种感觉,我错过了一些非常明显的东西。

更新:

让我们进一步简化这一点,因为我没有得到很多反馈。

 s3 = Aws::S3::Resource.new bucket = s3.bucket(ENV["BUCKET"]) bucket.object("some_file.txt").put(body:'Hello World!') 

以上完全适用于我的开发环境,但不适用于我的生产环境。 在生产中,当我调用put(body:'Hello World!')时它会出错。 我知道这可能与写权限或其他东西有关,但同样,我检查了我的环境变量,它们是相同的。 是否有一些我不知道应该检查的配置?

我尝试过使用新的IAM用户。 我还暂时将development.rb的全部内容复制到production.rb,只是为了查看开发或生产的配置是否影响它,但无济于事。 我也运行了捆绑更新。 再说一次,没有运气。

我希望错误更具描述性,但它只是说Seahorse::Client::NetworkingError (Connection reset by peer)无论我尝试什么。

好吧,我从来没有找到这个问题的解决方案,因为我在截止日期前不得不求助于其他选择。 我假设它是亚马逊端的一个bug或aws-sdk gem,因为我已多次检查我的配置,这是正确的。

我的解决方法是使用雾gem,这实际上非常方便。 将gem’fog gem 'fog'添加到我的gemfile并运行bundle install我的代码现在看起来像这样:

 def upload_to_s3(folder_name) filename = "ss-" + DateTime.now.strftime("%Y%d%m-%s") + "-" + SecureRandom.hex(4) + ".png" full_bucket_path = Pathname(folder_name.to_s).join(filename).to_s image_contents = open(url).read connection = Fog::Storage.new({ :provider => 'AWS', :aws_access_key_id => ENV["AWS_ACCESS_KEY_ID"], :aws_secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"] }) directory = connection.directories.get(ENV["BUCKET"]) file = directory.files.create(key: full_bucket_path, public: true) file.body = image_contents file.save return file.public_url end 

这很简单,实现起来也很轻松。 希望我知道是什么搞乱了aws-sdkgem,但对于任何有问题的人来说,给雾一点。