我有一个功能,用户上传一个XML文件,系统应该读取文件和导入数据。因此,该文件未附加到任何模型记录。所以我有一个允许文件输入的表单
<%= form_with(
multipart: true,
scope: :ctf,
url:some_path,
id: dom_id(Import.new, :form),
data: { turbo: false }
) do |form| %>
<%= render Content::SectionComponent.new do |section| %>
<span class="text-sm"><%= 'Upload XML' %></span>
<%= form.label :cf_file, 'File' %>
<%= form.file_field :cf_file, accept: 'application/xml', required: true %>
<% end %>
<% end %>
在控制器中,我将文件作为参数获取,并使用ActiveStorage::Blob手动上传。
def cf_upload
importer = Import.new(cf_upload_params)
if importer.valid?
file_storage = ActiveStorage::Blob.create_and_upload!(io: cf_upload_params[:cf_file], filename: filename)
Importers::Cf::ImportJob.perform_later(file_storage)
else
flash.now[:alert] = 'Something went wrong'
end
render :index
end
有没有什么方法可以使用ActiveStorage direct_upload来代替使用ActiveStorage::Blob.create_and_upload进行上传?
1条答案
按热度按时间1sbrub3j1#
根据the docs,
ActiveStorage::Blob
是一个数据库记录,它是根据ActiveRecord模型设计的。一个可能可行的选择是使用直接上传,它基本上允许您设置一些JS,以便将文件直接上传到您的存储服务(例如表单提交的是一个令牌,或者是上传文件的标识符。但是这个解决方案也是建立在假设
ActiveStorage::Blob
被创建的基础上的。所以你可能需要黑进去。但是如果你问--你能创建一个blob并将其上传到服务而不将其附加到任何其他模型上吗--绝对可以。未连接的斑点是一件事,这就是为什么医生正在解释如何清除他们,如果你想清理房子。