【发布时间】:2021-11-09 18:26:43
【问题描述】:
TL;DR
如何将文件路径输入 AWS S3 API Ruby 客户端,并将它们解释为图像,而不是字符串文字文件路径?
更多详情
我正在使用 Ruby AWS S3 客户端以编程方式上传图像。我从他们的示例启动代码中获取了这段代码,我自己几乎没有修改过。见https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/s3-example-upload-bucket-item.html
def object_uploaded?(s3_client, bucket_name, object_key)
response = s3_client.put_object(
body: "tmp/cosn_img.jpeg", # is always interpreted literally
acl: "public-read",
bucket: bucket_name,
key: object_key
)
if response.etag
return true
else
return false
end
rescue StandardError => e
puts "Error uploading object: #{e.message}"
return false
end
# Full example call:
def run_me
bucket_name = 'cosn-images'
object_key = "#{order_number}-trello-pic_#{list_config[:ac_campaign_id]}.jpeg"
region = 'us-west-2'
s3_client = Aws::S3::Client.new(region: region)
if object_uploaded?(s3_client, bucket_name, object_key)
puts "Object '#{object_key}' uploaded to bucket '#{bucket_name}'."
else
puts "Object '#{object_key}' not uploaded to bucket '#{bucket_name}'."
end
end
这可行并且能够上传到 AWS,但它只是从正文上传文件 path,而不是实际文件本身。
点击附件链接时显示的文件路径
据我从客户端文档中看到的,这应该有效。 https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#put_object-instance_method
另外,通过前端手动上传这个文件确实可以正常工作,所以它必须是我的代码中的一个问题。
您应该如何让 AWS 知道它应该将该文件路径解释为文件路径,而不仅仅是字符串文字?
【问题讨论】:
-
使用
upload_file代替put_object。否则你可以做body: open("tmp/cosn_img.jpeg", 'r').read() -
@jordanm 你能扩展你的答案吗?我尝试使用
body: open("tmp/cosn_img.jpeg", 'r').read(),但这似乎不起作用。它只是返回一个空字符串。而且我不确定如何将upload_file与其余的流程和身份验证结合起来。 -
您必须以
'rb'模式而不是'r'模式读取文件才能正确读取图像文件
标签: ruby-on-rails ruby amazon-web-services amazon-s3 filepath