2012-03-16 3 views
3

Ok поэтому я попытался два метода оба неЕсть ли способ загрузить файл с s3 с помощью ruby ​​gem aws-s3?

Первый метод, использующий aws-s3 камень

require 'aws/s3' 
S3ID = "MYACCESS" 
S3KEY = "MYKEY" 
include AWS::S3 
AWS::S3::Base.establish_connection!(
    :access_key_id  => S3ID, 
    :secret_access_key => S3KEY 
) 

bucket = AWS::S3::Bucket.find("test_bucket") 
=> #<AWS::S3::Bucket:0x007fea3e2898c8 @attributes={"xmlns"=>"http://s3.amazonaws.com/doc/2006-03-01/", "name"=>"test_bucket", "prefix"=>nil, "marker"=>nil, "max_keys"=>1000, "is_truncated"=>true}, @object_cache=[#<AWS::S3::S3Object:0x70322020960960 '/test_bucket/00000188110119_1000000731213/'>, #<AWS::S3::S3Object:0x70322020960660 '/test_bucket/00000188110119_1000000731213/10_08-52-08.mp3'>, #<AWS::S3::S3Object:0x703220209 

bucket.size 
=> 1000 

bucket.objects[0] 
=> #<AWS::S3::S3Object:0x70322028046080 '/test_bucket/00000188110119_1000000731213/'> 
bucket.objects[1] 
=> #<AWS::S3::S3Object:0x70322028046040 '/test_bucket/00000188110119_1000000731213/10_08-52-08.mp3'> 
bucket.objects[1].key 
=> "00000188110119_1000000731213/10_08-52-08.mp3" 

File.open("/Users/matt/local_copy.mp3", "w") do |f| 
    f.write(bucket.objects[1]) 
end 

UPDATE

bucket.objects[1] 
=> #<AWS::S3::S3Object:0x70322028046040 '/test_bucket/00000188110119_1000000731213/10_08-52-08.mp3'> 
bucket.objects[1].read 
NoMethodError: undefined method `read' for #<AWS::S3::S3Object:0x70322028046040> 
bucket.objects[1].class 
=> AWS::S3::S3Object 

Как вы можете видеть, что я пытаюсь сделать, это скопировать mp3 из ведра s3 и скопируйте его на локальный компьютер ... любые идеи о том, как это сделать

+0

возможно дубликат [Использование Отправить \ _file для удаленного источника (Ruby On Rails)] (http://stackoverflow.com/questions/1322030/using-send-file-to -a-remote-source-ruby-on-rails) –

ответ

7

См: http://docs.amazonwebservices.com/AWSRubySDK/latest/AWS/S3/S3Object.html

В основном вы должны использовать read и write методы объектов S3.

Итак:

File.open("/Users/matt/local_copy.mp3", "w") do |f| 
    f.write(bucket.objects[1].read) 
end 
+1

NoMethodError: undefined метод 'read 'для # Trace

+0

Я обновлю свой вопрос кодом ... Обновлено! – Trace

+1

ОК, это потому, что вы используете ОЧЕНЬ ОЧЕНЬ старый камень S3, этот драгоценный камень явно устарел. Вы должны использовать официальную жемчужину AWS SDK от Amazon. –

0

Если вы не вынуждены использовать драгоценный камень «aws-s3», вы можете проверить fog, что делает в основном одни и те же вещи, только он агностик относительно бэкэнда (aws, rackspace, ..) и кажется быть более активным. В нижней части this page есть пример, показывающий, что вы хотите достичь