AWS Ruby SDK核心:将文件上载到S3

AWS Ruby SDK核心:将文件上载到S3,ruby,amazon-web-services,amazon-s3,Ruby,Amazon Web Services,Amazon 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(

我想上传一个文件(任何文件,可以是.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\u me.sql
有几行

预期的行为是将文件
upload_me.sql
作为
mybucket/myfolder/upload_me.sql
上传到S3上。但是它只在
mybucket/myfolder/upload\u me.sql
中写一行,那就是
/upload\u me.sql

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

s3 = Aws::S3.new
resp = s3.put_object(
  :bucket => "mybucket",
  :key => "myfolder/upload_me.sql",
)
然后它只创建一个名为
mybucket/myfolder/upload_me.sql
的空键,该键甚至不可下载(好吧,即使下载了,也没用)

你能告诉我哪里出了问题吗

以下是关于
put\u对象
方法的ruby SDK核心文档:

更新: 如果我尝试使用AWS-CLI上载同一个文件,则可以很好地上载该文件。命令如下:

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

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")
)
根据文档,另一种方法是在bucket上使用write

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

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

因此,我的代码如下所示:

s3 = Aws::S3.new
resp = s3.put_object(
  :bucket => "mybucket",
  :key => "myfolder/upload_me.sql",
  :body => IO.read("./upload_me.sql")
)
另一种方法是

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


可能找不到文件,因为路径是相对的。 这是一种奇怪的行为,接口试图做出太多的决定

我可以向您保证这是有效的(v3):

client=Aws::S3::client.new(…)
client.put\u对象(
正文:'./现有的_file.txt',
水桶:“踢它”,
键:“test1.txt”
)#kick it:/test1.txt包含与现有_file.txt相同的内容
client.put\u对象(
正文:'./不存在的文件.txt',
水桶:“踢它”,
键:“test2.txt”
)#kick it:/test2.txt仅包含字符串“./non_existing_file.txt”

如果你问我的话,在这两种情况下都使用body是一个糟糕的决定。

另一种方法是使用body。它需要
需要“aws sdk”
。我使用的是更新的ruby AWS-SDK-CORE,它需要
要求“AWS SDK CORE
”。此外,较旧的SDK将对象定义为
AWS::S3.new
,而较新的SDK将对象定义为
AWS::S3.new
。使用
File.read的第一种解决方案可能不适用于非文本文件。谢谢你抽出时间来。嘿@Pafjo,你的反应让我的头朝着正确的方向旋转。我已经发布了答案。