我设置了Rails应用程序,使用本教程将文件直接上传到AWS S3,并且效果很好。现在,我正在使用此帖子中使用相同方法的直接下载作品。当我尝试触发下载时,悬挂它,然后最终返回以下错误:
致命at/user/doc_uploads/download 例外重新输入
下面代码中的puts
显示了服务器上似乎是无限循环。我只是对该代码应该如何弄清楚这一点不太了解。请帮助!
doc_uploads_controller.rb
def get
@doc_download = @user.doc_uploads.find_by_id(params[:id])
if @doc_download
key = @doc_download.file_url.split('amazonaws.com/')[1]
puts key
puts S3_BUCKET_NAME
bucketlink = S3_BUCKET_NAME.object(key).presigned_url(:get, expires_in: 3600)
puts bucketlink
redirect_to bucketlink
else
flash[:error]="Something went wrong."
redirect_to user_dashboard_path
end
end
aws.rb:
Aws.config.update({
region: 'us-east-1',
credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY']),
})
S3_BUCKET_NAME = Aws::S3::Resource.new.bucket(ENV['S3_BUCKET_NAME'])
routes.rb:
get 'user/doc_uploads/download', to: 'doc_uploads#get'
查看:
<% @doc_uploads.each do |doc_upload| %>
...
<%= link_to user_doc_uploads_download_path(id: doc_upload.id), target: '_blank' do %>
<p class="glyphicon glyphicon-download-alt"></p>
<% end %>
...
<% end %>
预先感谢!
如果您能够在代码中正确获取URL,因此您也可以从该URL读取图像。
尝试以下操作:
def get
@doc_download = @user.doc_uploads.find_by_id(params[:id])
if @doc_download
data = open(@doc_download.file_url)
send_data data.read, filename: 'filename', stream: 'true', buffer_size: '4096'
else
flash[:error]="Something went wrong."
redirect_to user_dashboard_path
end
end
在此处找到了最近的帖子,并使他们的解决方案正常工作,as
presigner = Aws::S3::Presigner.new
url = presigner.presigned_url(:get_object, bucket: ENV['S3_BUCKET_NAME'], key: key, expires_in: 3600, response_content_disposition: "attachment").to_s
redirect_to url