ruby-on-rails - 没有模型的 Rails Active Storage
问题描述
可以在没有模型支持的情况下使用 Rails Active Storage 吗?我有一个表格,我需要上传一个文件,但我不希望它附加到模型上。我只需要上传文件,这样我就可以使用后台作业处理它,然后将其删除。
解决方案
是的。
当 ActiveStorage 由模型支持时,涉及两个部分:
- 在表
ActiveStorage::Blob
中保存文件信息的记录active_storage_blobs
- 使用表
ActiveStorage::Attachment
将 blob 连接到模型的记录active_storage_attachments
如果您直接调用,您可以跳过创建ActiveStorage::Attachment
记录create_and_upload!
。这将创建一个唯一键,确定内容类型,计算校验和,将条目存储在 中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)
要上传没有模型的文件,您可以使用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)
...
推荐阅读
- istio - 如何通过 Minikube/Windows 上的 Istio 中的 Gateway 或 Ingress 访问 hello world Java 微服务?我被困了几个小时/几天/几周
- reactjs - 尝试通过 Apollo Query 和 Formik 在 React 渲染道具中使用函数时的 Typescript TS2349
- three.js - 如何以编程方式撤消到枢轴点的位置转换?
- java - 是否可以在不使用 JavaMail api 对端口进行硬编码的情况下连接到邮件服务器,基本上代码应该独立于端口。?
- c# - 如何在异步函数中发送参数值
- mysql - 创建kafka连接器时,使用localhost:8083,总是报错:curl(7) connection denied
- vb.net - Visual Studio 2010 @ 高 DPI
- reactjs - 如何从子组件中获取父级中的值(来自输入)
- php - 从两个不同的多维数组中获取唯一值
- cmake - 在柯南 cmake 配置中包含路径错误