2015-10-08 56 views
1

我试图通过我的Rails应用程序访问我的S3服务器上的文件。目前,该应用程序能够通过aws-sdk v2 gem创建presigned_url,然后重定向以显示文件(我主要使用图像作为文件)。这一切都工作得很好,但不是简单地在浏览器中显示文件,我真的很想触发该文件的自动下载。用presigned_url触发下载S3文件

因为它的立场与重定向,我的代码如下:

def get 
    asset = current_user.assets.find_by_id(params[:id]) 

    if asset 
     s3 = Aws::S3::Resource.new 
     bucketlink = s3.bucket(ENV['S3_BUCKET_NAME']).object(asset.uploaded_file.path).presigned_url(:get, expires_in: 3600) 
     redirect_to bucketlink 
    else 
     flash[:error]="Don't be cheeky! Mind your own assets" 
     redirect_to assets_path 
    end 
end 

谁能给我一个线索,我怎么能触发下载这个文件?提前谢谢了。

回答

3

我对ruby一无所知,所以这是一个猜测......但基于我的专业知识直接与REST API和quick search of the SDK docs对于特定的字符串我想到了,我想你正在寻找像这样:

bucketlink = s3.bucket(ENV['S3_BUCKET_NAME']).object(asset.uploaded_file.path).presigned_url(:get, expires_in: 3600, response_content_disposition: 'attachment; filename=myfile.jpg') 

&response-content-disposition=value出现在经认证的GET请求的查询字符串,S3返回该值作为响应的Content-Disposition:报头。 “附件”的意思是“下载,不显示”,文件名是浏览器通常使用的文件名,或者如果显示“另存为”提示,则提供默认文件...所以用户下载的文件名可能不同比在S3中存储的文件名。 'attachment;<space>filename=<target-filename>'是一个单独的字符串,您希望构建它以包含合理的内容,而不是“myfile.jpg”。

+1

哇,我印象深刻。非常感谢。 – neanderslob

+0

对于下一个人来说,我最终并不需要文件名,所以我最终使用了以下内容:'bucketlink = s3.bucket(ENV ['S3_BUCKET_NAME'])。object(asset.uploaded_file.path)。 presigned_url(:get,expires_in:3600,response_content_disposition:'attachment')' – neanderslob

+0

@neanderslob我试图做这个确切的事情,但运行到一个无限循环问题[这里概述](http://stackoverflow.com/questions)/42687386 /轨道下载-的-AWS-S3采用-presigned-后致命的异常-文件)。你碰到过这个吗?你怎么称呼你的get方法? – CChandler81