2

我正在构建一个 Rails 应用程序,它允许用户直接在浏览器中访问某些上传的文件,但与实际文件的 URL 不同。这样可以通过强制登录来保护文件。

因此,例如,您可以访问以下位置的文件:domain.com/file/19371da

过去,我通过使用 CarrierWave 完成此操作,然后to_blob对文件本身进行操作,然后使用send_data和使用数据库中存储的有关文件的数据将其发送回:

send_data @file.file.to_blob, stream: false, filename: @file.name, type: @file.mime_type, disposition: 'inline'

然而,当使用新的 Active Storage 作为 CarrierWave 的潜在替代品时,我在将实际文件本身作为 blob 传递给该send_data方法时遇到了困难。

例如

send_data @file.file.to_blob, stream: false, filename: @file.file.blob.filename, type: @user.file.blob.content_type, disposition: 'inline'

它给出了一个错误undefined method 'to_blob' for #<ActiveStorage::Attached::One:0x007f8f23ca2718>

如何在 Active Storage 中将实际文件作为 blob 获取?

4

3 回答 3

3

查看源代码似乎ActiveStorage::Attached::One有一种blob方法,这意味着您应该可以调用:

@file.file.blob
于 2018-01-11T15:59:57.670 回答
2

所以要做到这一点,你必须使用以下download方法:

例如

send_data @file.file.download, filename: @file.file.blob.filename, type: @user.file.blob.content_type, disposition: 'inline'
于 2018-01-11T17:53:07.693 回答
1

我想你现在已经解决了你的问题。如果没有,您可以查看文档以了解如何从关系中获取 Blob - 使用has_one_attached快捷方式。has_many_attached<my_relation>_blob

要获得直接下载的链接,您可以这样做:

 @my_model.file_blob.service_url_for_direct_upload expires_in: 30.minutes

根据您希望系统的安全程度,您可以将这个短暂的 url 发送给您的登录用户,它不会公开原始文件路径(对此不是 100% 确定)。

于 2018-03-27T10:58:20.740 回答