将ActiveStorage blob作为blob获取

时间:2018-01-11 15:57:16

标签: ruby-on-rails rails-activestorage

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

例如,您可以访问以下文件:to_blob

过去我通过使用CarrierWave完成此操作,然后对文件本身执行send_data,然后使用send_data @file.file.to_blob, stream: false, filename: @file.name, type: @file.mime_type, disposition: 'inline' 将其发回并使用存储在数据库中的文件的数据:

send_data

然而,当使用新的Active Storage作为CarrierWave的潜在替代品时,我已经遇到了将实际文件本身作为blob传递给send_data @file.file.to_blob, stream: false, filename: @file.file.blob.filename, type: @user.file.blob.content_type, disposition: 'inline' 方法的障碍。

e.g。

undefined method 'to_blob' for #<ActiveStorage::Attached::One:0x007f8f23ca2718>

它出错public enum BestemmingBad implements Bestemming { TEST("test"), TEST2("test2"); BestemmingBad(final String value) { this.value = value; } @Override public String getUrl() { final String jmsServer = Guice.createInjector().getInstance(MyEnvironmentConfig.class).retrieveJmsServerName(); return jmsServer + "/" + value; } }

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

3 个答案:

答案 0 :(得分:2)

查看ActiveStorage::Attached::One的{​​{3}},看起来有一个blob方法,这意味着您应该可以致电:

@file.file.blob

答案 1 :(得分:2)

为此,您必须使用download方法:

e.g。

send_data @file.file.download, filename: @file.file.blob.filename, type: @user.file.blob.content_type, disposition: 'inline'

答案 2 :(得分:1)

我认为你从现在开始解决了你的问题。 如果没有,您可以使用has_one_attachedhas_many_attached documentation来了解如何从关系中获取Blob - 使用<my_relation>_blob快捷方式。

要获得a link for direct-download,您可以执行以下操作:

 @my_model.file_blob.service_url_for_direct_upload expires_in: 30.minutes

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