ruby-on-rails – 使用Send_File到远程源(Ruby on Rails)

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 使用Send_File到远程源(Ruby on Rails)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的应用程序中,我有一个要求让我失望.

我有一个存储在S3中的文件,当用户点击我的应用程序中的链接时,我登录了他们点击链接数据库,然后将他们的“下载信用额”减去一个,然后我想提示文件下载.

我不想将用户重定向文件,因为它存储在S3中,我不希望他们拥有源文件链接(以便我可以保持完整性和访问权限)

看起来send_file()不会使用远程源文件,任何人都推荐一个gem或适合的代码,这样做?

解决方法

在S3桶/对象读取文件时,您需要将文件内容流传输给用户.

如果您使用AWS::S3图书馆这样可能会工作:

send_file_headers!( :length=>S3Object.about(<s3 object>,<s3 bucket>)["content-length"],:filename=><the filename> )
 render :status => 200,:text => Proc.new { |response,output|
   S3Object.stream(<s3 object>,<s3 bucket>) do |chunk|
     output.write chunk
   end
 }

这个代码大多是从send_file代码复制的,它本身只能用于本地文件或类似文件的对象

注:我无论如何建议不要从rails进程本身提供文件.如果可能/可以接受您的用例,我将使用经过身份验证的GET来从桶中提供私有数据.

使用经过身份验证的GET,您可以将存储桶及其对象保留为私有,同时允许临时许可通过制作包含身份验证签名令牌的URL来读取特定对象内容.用户只需重定向到经过身份验证的URL,令牌只能在几分钟内生效.

使用上述AWS :: S3,您可以通过以下方式获取经过身份验证的GET URL:

time_of_exipry = Time.now + 2.minutes
 S3Object.url_for(<s3 object>,<s3 bucket>,:expires => time_of_exipry)

猜你在找的Ruby相关文章