AWS Ruby SDK核心:将文件上载到S3
我想上传一个文件(任何文件,可以是.txt、.mp4、.mp3、.zip、.tar…等等)到AWS 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(
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,你的反应让我的头朝着正确的方向旋转。我已经发布了答案。