Ruby on rails 将ActiveStorage blob作为blob获取
我正在构建一个Rails应用程序,允许用户直接在浏览器中访问某些上传的文件,但访问的URL与实际文件不同。这是为了通过强制登录来保护文件 例如,您可以访问以下位置的文件:Ruby on rails 将ActiveStorage blob作为blob获取,ruby-on-rails,rails-activestorage,Ruby On Rails,Rails Activestorage,我正在构建一个Rails应用程序,允许用户直接在浏览器中访问某些上传的文件,但访问的URL与实际文件不同。这是为了通过强制登录来保护文件 例如,您可以访问以下位置的文件:domain.com/file/19371da 过去,我使用CarrierWave,然后对文件本身执行到\u blob,然后使用发送\u data并使用数据库中存储的文件数据将其发送回: send_data @file.file.to_blob, stream: false, filename: @file.name, type
domain.com/file/19371da
过去,我使用CarrierWave,然后对文件本身执行到\u blob
,然后使用发送\u data
并使用数据库中存储的文件数据将其发送回:
send_data @file.file.to_blob, stream: false, filename: @file.name, type: @file.mime_type, disposition: 'inline'
但是,当使用新的活动存储作为CarrierWave的潜在替代品时,我遇到了一个障碍,无法将实际文件本身作为blob传递给send\u data
方法
e、 g
它为#提供了一个错误未定义的方法'u blob'
如何在Active Storage中将实际文件作为blob获取?查看forActiveStorage::Attached::One
似乎有一个blob
方法,这意味着您应该能够调用:
@file.file.blob
因此,要做到这一点,您必须使用下载
方法:
e、 g
我想你现在已经解决了你的问题。
如果没有,您可以通过附加了一个
并了解如何从关系中获取Blob–使用Blob
快捷方式
要获得,您可以执行以下操作:
@my_model.file_blob.service_url_for_direct_upload expires_in: 30.minutes
取决于您希望系统的安全程度,您可以将这个简短的url发送给您的登录用户,它不会公开原始文件路径(这一点不是100%确定) 嗯,对我不起作用。当我检查blob方法时,虽然它只是对活动\u存储\u blob
中存储在数据库中的记录的值的散列,而不是像我调用到\u blob
那样的文件本身的实际blob。您可以访问@file.file.attachment
中的附件值。因此它看起来不像。blob
是以blob形式访问文件的正确方法,因为该方法只返回blob对象。请参阅下面的响应-使用下载方法
send_data @file.file.download, filename: @file.file.blob.filename, type: @user.file.blob.content_type, disposition: 'inline'
@my_model.file_blob.service_url_for_direct_upload expires_in: 30.minutes