Rails 没有模型的活动存储
Rails Active Storage without model
Rails Active Storage 可以在没有模型支持的情况下使用吗?我有一个表格,我需要上传一个文件,但我不希望它附加到模型上。我只需要上传文件,这样我就可以用后台作业处理它,然后删除它。
是的。
当 ActiveStorage 由模型支持时,涉及两个部分:
- 一条
ActiveStorage::Blob
记录,其中包含 active_storage_blobs
table 中的文件信息
- 使用
active_storage_attachments
table 将 blob 连接到模型的 ActiveStorage::Attachment
记录
如果您直接调用 create_and_upload!
,则可以跳过创建 ActiveStorage::Attachment
记录。这将创建一个唯一键,确定内容类型,计算校验和,将条目存储在 active_storage_blobs
中,然后上传文件:
filename = 'local_file.txt'
file = File.open(filename)
blob = ActiveStorage::Blob.create_and_upload!(io: file, filename: filename)
您稍后可以通过以下方式下载:
blob.download
并删除:
blob.purge
如果您想完全跳过 ActiveStorage::Blob
的存储,您需要直接转到管理上传和下载文件的存储服务。例如,如果您使用的是 Disk
存储空间,您会看到类似这样的内容:
ActiveStorage::Blob.service
=> #<ActiveStorage::Service::DiskService ...
然后您必须生成自己的密钥并执行以下操作:
service = ActiveStorage::Blob.service
key = 'some_unique_key'
service.upload(key, file)
service.download(key)
service.delete(key)
要上传没有模型的文件,您可以use form_with
and specify a url
喜欢:
<%= form_with url: "/uploads", multipart: true do |form| %>
<%= form.file_field :picture %>
<%= form.submit %>
<% end %>
然后在服务器上您可以通过以下方式获得 file
:
file = params[:picture]
blob = ActiveStorage::Blob.create_and_upload!(io: file, filename: file.original_filename)
...
Rails Active Storage 可以在没有模型支持的情况下使用吗?我有一个表格,我需要上传一个文件,但我不希望它附加到模型上。我只需要上传文件,这样我就可以用后台作业处理它,然后删除它。
是的。
当 ActiveStorage 由模型支持时,涉及两个部分:
- 一条
ActiveStorage::Blob
记录,其中包含active_storage_blobs
table 中的文件信息
- 使用
active_storage_attachments
table 将 blob 连接到模型的
ActiveStorage::Attachment
记录
如果您直接调用 create_and_upload!
,则可以跳过创建 ActiveStorage::Attachment
记录。这将创建一个唯一键,确定内容类型,计算校验和,将条目存储在 active_storage_blobs
中,然后上传文件:
filename = 'local_file.txt'
file = File.open(filename)
blob = ActiveStorage::Blob.create_and_upload!(io: file, filename: filename)
您稍后可以通过以下方式下载:
blob.download
并删除:
blob.purge
如果您想完全跳过 ActiveStorage::Blob
的存储,您需要直接转到管理上传和下载文件的存储服务。例如,如果您使用的是 Disk
存储空间,您会看到类似这样的内容:
ActiveStorage::Blob.service
=> #<ActiveStorage::Service::DiskService ...
然后您必须生成自己的密钥并执行以下操作:
service = ActiveStorage::Blob.service
key = 'some_unique_key'
service.upload(key, file)
service.download(key)
service.delete(key)
要上传没有模型的文件,您可以use form_with
and specify a url
喜欢:
<%= form_with url: "/uploads", multipart: true do |form| %>
<%= form.file_field :picture %>
<%= form.submit %>
<% end %>
然后在服务器上您可以通过以下方式获得 file
:
file = params[:picture]
blob = ActiveStorage::Blob.create_and_upload!(io: file, filename: file.original_filename)
...