Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将ActiveStorage blob作为blob获取_Ruby On Rails_Rails Activestorage - Fatal编程技术网

Ruby on rails 将ActiveStorage blob作为blob获取

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

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

例如,您可以访问以下位置的文件:
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获取?

查看for
ActiveStorage::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