2014-04-13 65 views
3

我想使用AWS-SDK-CORE ruby SDKAWS Ruby SDK CORE:将文件上传到S3

将文件(任何文件,可能是.txt,.mp4,.mp3,.zip,.tar等)上传到AWS S3

这里是我的代码:

require 'aws-sdk-core' 
Aws.config = { 
    :access_key_id => MY_ACCESS_KEY 
    :secret_access_key => MY_SECRET_KEY, 
    :region => 'us-west-2' 
} 

s3 = Aws::S3.new 
resp = s3.put_object(
    :bucket => "mybucket", 
    :key => "myfolder/upload_me.sql", 
    :body => "./upload_me.sql" 
) 

现在,上面的代码运行,并创建了一个具有只写了一行一键myfolder/upload_me.sql,这是./upload_me.sql这是不对的。文件upload_me.sql有几行。

预期的行为是上传S3上的文件upload_me.sql作为mybucket/myfolder/upload_me.sql。但是,相反它只是写一行mybucket/myfolder/upload_me.sql,这是./upload_me.sql

现在,如果我省略:body部分如下:

s3 = Aws::S3.new 
resp = s3.put_object(
    :bucket => "mybucket", 
    :key => "myfolder/upload_me.sql", 
) 

然后,它只是创建,并呼吁mybucket/myfolder/upload_me.sql空键甚至未下载(好吧,即使它被下载,它也没用)

你能指出我哪里出错了吗?

这里是put_object方法红宝石SDK-核心文档:http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/V20060301.html#put_object-instance_method

UPDATE: 如果我尝试上传使用AWS-CLI同一个文件,它被上传的罚款。这里是命令:

aws s3api put-object --bucket mybucket --key myfolder/upload_me.sql --body ./upload_me.sql 

回答

8

所以,在htis问题上花了一个令人沮丧的周日下午后,我终于破解了它。我真正需要的是:body => IO.read("./upload_me.sql")

所以我的代码看起来像下面:

s3 = Aws::S3.new 
resp = s3.put_object(
    :bucket => "mybucket", 
    :key => "myfolder/upload_me.sql", 
    :body => IO.read("./upload_me.sql") 
) 
1

body变量是将被写入S3的内容。所以如果你发送一个文件到S3你需要通过使用File.read(“upload_me.sql”)手动加载类似的东西。

s3 = Aws::S3.new 
resp = s3.put_object(
    :bucket => "mybucket", 
    :key => "myfolder/upload_me.sql", 
    :body => File.read("./upload_me.sql") 
) 

根据文档,另一种方法是在桶上使用写入。

s3 = AWS::S3.new 
key = File.basename(file_name) 
s3.buckets["mybucket"].objects[key].write(:file => "upload_me.sql") 
+1

的'另一种方式去做这个'是针对[适用于ruby的旧版AWS SDK](http://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpRuby.html)。它需要'需要'aws-sdk''。我正在使用新的ruby AWS-SDK-CORE,它需要'需要'aws-sdk-core''。此外,较旧的SDK将对象定义为'AWS :: S3.new',而较新的sdk则将对象定义为'Aws :: S3.new'。使用'File.read'的第一个解决方案可能不适用于非文本文件。谢谢你的时间。 – slayedbylucifer

+0

+1。嘿@Pafjo,你的回应让我的头向正确的方向旋转。我已经发布了答案。 – slayedbylucifer

0

另一种方式是

AWS.config(
    :access_key_id => 'MY_ACCESS_KEY', 
    :secret_access_key => 'MY_SECRET_KEY', 
) 

#Set the filename 
file_name = 'filename.txt' 

#Set the bucket name 
s3_bucket_name = 'my bucket name' 

#If file has to go in some specific folder 
bucket_directory = 'key or folder' 

begin 
    s3 = AWS::S3.new 

    #Check if directory name has provided and Make an object in your bucket for your upload 
    if bucket_directory == '' 
    bucket_obj = s3.buckets[s3_bucket_name].objects[bucket_directory] 
    else 
    bucket_obj = s3.buckets[s3_bucket_name].objects["#{bucket_directory}/#{file_name}"] 
    end 

    # Upload the file 
    bucket_obj.write(:file => file_name) 
    puts "File was successfully uploaded : #{bucket_obj}" 
rescue Exception => e 
    puts "There was an error in uploading file: #{e}" 
end 

Working Example

Reference