簡體   English   中英

不帶 model 的 Rails 主動存儲

[英]Rails Active Storage without model

Rails Active Storage 可以在沒有 model 支持的情況下使用嗎? 我有一個表格,我需要上傳一個文件,但我不希望它附加到 model。 我只需要上傳文件,這樣我就可以使用后台作業處理它,然后將其刪除。

是的。

當 ActiveStorage 由 model 支持時,涉及兩個部分:

  • 一個ActiveStorage::Blob記錄,在active_storage_blobs表中保存文件信息
  • 使用active_storage_attachments表將 blob 連接到 model 的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的存儲,則需要 go go 直接到管理上傳和下載文件的存儲服務。 例如,如果您使用的是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)

要上傳沒有 model 的文件,您可以使用form_with並指定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)
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM