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)
...