Ruby v2 的 aws-sdk:在我将对象放入 S3 存储桶后检查成功状态
Posted
技术标签:
【中文标题】Ruby v2 的 aws-sdk:在我将对象放入 S3 存储桶后检查成功状态【英文标题】:aws-sdk for Ruby v2: check success status after I PUT object in S3 bucket 【发布时间】:2017-03-01 12:19:08 【问题描述】:我正在使用适用于 Ruby 的 aws-sdk v2,我发现对象上可用的方法非常有限。我像这样创建了一个存储桶:
client = Aws::S3::Client.new(region: 'us-west-2')
s3 = Aws::S3::Resource.new(client: client)
S3_BUCKET = s3.bucket(ENV['AWS_BUCKET'])
我发现可以将对象写入我的存储桶的唯一方法是put.
但是,我没有看到此方法可用的“success_action_status”。我已将我的应用程序部署到 Elastic Beanstalk。在本地,我可以写入此存储桶,但是当我尝试写入我的 eb 应用程序时,它无法正常工作,我正在盲目地试图弄清楚发生了什么。任何有助于确定我的 PUT 请求出错的信息都会有所帮助。
这是我的方法现在的样子:
def create
username = params[:user][:user_alias]
key = "uploads/#username"
obj = S3_BUCKET.object(key)
obj.put(
acl: 'public-read',
body: params[:user][:image_uri],
)
@user = User.new(user_params)
if @user.save
render json: @user, status: :created, location: @user
else
render json: @user.errors, status: :unprocessable_entity
end
end
这是我所指的有关 PUT 方法的文档:http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Object.html#put-instance_method
【问题讨论】:
【参考方案1】:您似乎不是在put
ing 图像文件,只有 uri。文档对put
方法的body
选项这么说:
body: source_file, # file/IO object, or string data
您必须阅读或打开图像文件才能实际上传图像:
obj.put(
acl: 'public-read',
body: File.open(params[:user][:image_uri], ?r),
)
然后你可以通过exists?查看成功状态
【讨论】:
有道理,谢谢!图片将被设置为 bytea 数据类型 - 我还需要读取/打开它才能上传吗? 另外,我很困惑为什么有些东西会在本地发布到 S3,但部署的应用程序上什么也没有。现在我正在通过传入一个字符串进行测试,当我在本地发布时,该字符串出现在 S3 存储桶中,但是当我在 eb 上执行完全相同的帖子时,什么也没有出现。为什么它在已部署的版本上不起作用? 您的服务器是否具有 AWS 凭据或允许其写入 S3 的策略? 我没有主动设置,所以可能没有。我一直在查看文档,但不清楚如何为我的 Elastic Beanstalk 应用程序提供写入 S3 的策略。 您必须登录您的 AWS 控制台,转到 EC2 部分,那里应该有您的应用程序的实例以及向其添加策略的选项docs.aws.amazon.com/AWSEC2/latest/UserGuide/…以上是关于Ruby v2 的 aws-sdk:在我将对象放入 S3 存储桶后检查成功状态的主要内容,如果未能解决你的问题,请参考以下文章
使用 aws-sdk ruby gem 知道自己的实例 ID
使用 aws-sdk-v1 从 ruby 脚本中的 AWS SSM Parameter Store 获取数据
Ruby返回的HTTPVersionNotSupported对象