gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:53:47 25 4
gpt4 key购买 nike

在我的应用程序中,我有一个让我难过的要求。

我有一个文件存储在 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 来提供存储桶中的私有(private)数据。

使用经过身份验证的 GET,您可以使存储桶及其对象保持私有(private),同时允许通过制作包含身份验证签名 token 的 URL 来读取特定对象内容的临时权限。用户被简单地重定向到经过身份验证的 URL,并且 token 可以在几分钟内有效。

使用上面提到的 AWS::S3,您可以通过以下方式获取经过身份验证的 GET url:
 time_of_exipry = Time.now + 2.minutes
S3Object.url_for(<s3 object>, <s3 bucket>,
:expires => time_of_exipry)

关于ruby-on-rails - 使用 Send_File 到远程源(Ruby on Rails),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1322030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com