我是编码新手,我希望我能正确解释这个问题。像大多数人一样,我开始使用 Ruby on Rails。
我正在尝试从 AWS S3 请求一个 url,以传递到 20 分钟后过期的客户端浏览器。我已经安装了 aws-sdk gem 并运行了 bundle install 等。
我有一个欢迎 Controller 和一个索引 View 。我的 Controller 中有以下代码:
class WelcomeController < ApplicationController
def index
end
def doc_download
require 'aws-sdk'
s3 = Aws::S3::Client.new(
access_key_id: 'mykey',
secret_access_key: 'mykey'
)
aws_resource = Aws::S3::Resource::new
aws_resource.bucket('mynewapp.herokuapp.com').object('1.jpg').presigned_url(:get, expires_in: 20.minutes)
@download = doc_download
end
end
那么这在我看来
<p><%= link_to 'Download', @download %></p>
但是什么也没发生,当我点击“下载”链接时页面会刷新。
非常感谢任何帮助,花了几天时间试图从许多试图完成此任务的不同帖子中找出答案。
最佳答案
我在使用 aws-sdk-s3
时也遇到了类似的问题。 gem(版本 1.8.2
)。就我而言,我必须将文件上传到 S3,然后向用户显示一个即将到期的 URL。我生成的代码如下所示:
# Upload a file to S3 and return an expiring URL
# @param [IOStream] file
# @param [String] file_path
# @param optional [Integer] expiring_in_seconds (600)
# @returns [String] expiring and pre-signed URL
def upload_file(file, file_path, expiring_in_seconds = 600)
# upload file to S3
client = Aws::S3::Client.new
client.put_object({
body: file,
bucket: ENV['S3_BUCKET_NAME'],
key: file_path
})
# create an S3 object reference
obj = Aws::S3::Object.new(ENV['S3_BUCKET_NAME'], file_path)
# create pre-signed url
obj.presigned_url(:get, expires_in: expiring_in_seconds)
end
请记住,我的环境变量中有以下 AWS 凭证和设置:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_REGION
S3_BUCKET_NAME
S3_SIGNATURE_VERSION
关于ruby-on-rails - Ruby on Rails 和 AWS S3 即将到期下载链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48083611/