使用Presigned_post -Fatal Deface下载AWS S3文件



我设置了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

最新更新