【问题标题】:Rails Active Storage without model没有模型的 Rails Active Storage
【发布时间】:2021-04-20 09:57:53
【问题描述】:

可以在没有模型支持的情况下使用 Rails Active Storage 吗?我有一个表格,我需要上传一个文件,但我不希望它附加到模型上。我只需要上传文件,这样我就可以使用后台作业对其进行处理,然后将其删除。

【问题讨论】:

    标签: ruby-on-rails rails-activestorage


    【解决方案1】:

    是的。

    当 ActiveStorage 由模型支持时,涉及两个部分:

    • active_storage_blobs 表中保存文件信息的ActiveStorage::Blob 记录
    • 使用 active_storage_attachments 表将 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)
    ...
    

    【讨论】:

    • 谢谢。我如何将它与从表单上传的文件结合起来?如果您知道我的意思,当文件尚未上传时,我无法打开文件来制作 blob?
    • 添加了一个例子。
    • 太棒了。那很完美。我应该能够从这里继续建设!非常感谢!
    • 这是一个高质量的答案,谢谢。 @rctneil 你应该接受这个
    • @Barry 非常正确,接受!
    猜你喜欢
    • 2020-02-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多