Ruby aws-sdk - 超时错误

ale*_*333 3 ruby ruby-on-rails amazon-s3 ruby-on-rails-3

我正在尝试使用以下简单代码将文件上传到S3:

bucket.objects.create("sitemaps/event/#{file_name}", open(file))
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

未在超时期限内读取或写入与服务器的套接字连接.空闲连接将被关闭.

怎么可能出错?任何提示将不胜感激.

Tre*_*owe 7

当基于打开的文件无法正确确定内容长度时,通常会发生此超时.S3正在等待未来的其他字节.修复非常简单,只需以二进制模式打开文件即可.

Ruby 1.9

bucket.objects.create("sitemaps/event/#{file_name}", open(file, 'rb', :encoding => 'BINARY'))
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8

bucket.objects.create("sitemaps/event/#{file_name}", open(file, 'rb'))
Run Code Online (Sandbox Code Playgroud)

如果您传入文件的路径,aws-sdk gem将为您处理:

# use a Pathname object
bucket.objects.create(key, Pathname.new(path_to_file))

# or just the path as a string
bucket.objects.create(key, :file => path_to_file)
Run Code Online (Sandbox Code Playgroud)

此外,您可以在s3中存在之前写入对象,因此您还可以执行以下操作:

# my favorite syntax
obj = s3.buckets['bucket-name'].objects['object-key'].write(:file => path_to_file)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.