我正在构建一个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获取?
答案 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_attached
和has_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%确定)。