ruby-on-rails – 使用S3 Presigned-URL上传一个文件,然后该文件
发布时间:2020-12-17 04:19:47 所属栏目:百科 来源:网络整理
导读:我正在使用 Ruby on Rails和AWS gem. 我可以获得上传和下载的预签名网址. 但是当我得到URL时没有文件,因此将acl设置为’public-read’ 在download-url上不起作用. 用例是这样的:1,服务器为用户提供了一个将内容上传到我的存储桶的路径,如果没有凭据,则无法
我正在使用
Ruby on Rails和AWS gem.
我可以获得上传和下载的预签名网址. 但是当我得到URL时没有文件,因此将acl设置为’public-read’ 在download-url上不起作用. 用例是这样的:1,服务器为用户提供了一个将内容上传到我的存储桶的路径,如果没有凭据,则无法读取. 2,该内容需要在以后公开:任何人都可以阅读. 澄清: 解决方法
为PUT对象请求生成预签名URL时,可以指定上载者必须使用的密钥和ACL.如果我希望用户使用密钥“files / hello.txt”将objet上传到我的存储桶,并且该文件应该是公共可读的,我可以执行以下操作:
s3 = Aws::S3::Resource.new obj = s3.bucket('bucket-name').object('files/hello.text') put_url = obj.presigned_url(:put,acl: 'public-read',expires_in: 3600 * 24) #=> "https://bucket-name.s3.amazonaws.com/files/hello.text?X-Amz-..." obj.public_url #=> "https://bucket-name.s3.amazonaws.com/files/hello.text" 我可以把put_url给别人.此URL将允许他们将对象PUT到URL.它具有以下条件: > PUT请求必须在给定的到期时间内完成.在上面的例子中,我指定了24小时. :expires_in选项不得超过1周. 使用put_url,我可以使用Ruby的Net :: HTTP上传任何对象: require 'net/http' uri = URI.parse(put_url) request = Net::HTTP::Put.new(uri.request_uri,'x-amz-acl' => 'public-read') request.body = 'Hello World!' http = Net::HTTP.new(uri.host,uri.port) http.use_ssl = true resp = http.request(request) 现在该对象已被其他人上传,我可以向#public_url发出一个vanilla GET请求.这可以通过浏览器,curl,wget等来完成. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |