在保存到 ActiveStorage 之前获取文件名 - Rails 5.2.1

Getting filename before saving in ActiveStorage - Rails 5.2.1

我试图在 ActiveStorage 继续保存之前获取用户上传的文件的名称。该表格是使用 form_with 生成的,如下所示:

<%= form_with model: upload do |form| %>
  <div class="">
    <%= form.file_field :files, multiple: true, direct_upload: true, required: true %>
    <%= form.label :files, '', class: 'icon ion-ios-cloud-upload' do %>
      <span>click the icon to select files</span>
    <% end %>

    <div class="actions">
      <%= form.submit "Upload", class: "btn btn-primary" %>
    </div>
 </div>
<% end %>

我已尝试访问 params[:upload][files] 并按照 here 所述对其调用 .original_filename,但出现错误 NoMethodError: undefined method `original_filename' for #<String:0x007fac77fd18c8>

当我检查参数时,文件确实以字符串形式返回,那么如何获取文件名或如何让 original_filename 工作?

您需要在表单中添加 multipart: true

https://guides.rubyonrails.org/form_helpers.html#uploading-files

另一件事是,如果您有多个文件,您将有多个文件名。

params[:upload][files].each do |file|
  file.original_filename
end

我终于能够在附加文件后通过 file.blob.filename 获取文件名。

基于 the ActiveStorage documentation,我发现这对我有用:

file.filename.to_s

在我的例子中,我有一个

的模型
has_one_attached :file

OP的情况略有不同,你的情况可能也不同,所以相应调整。

Troy 的解决方案原样对我不起作用。我必须添加 .to_s 来获取文件名而不是 ActiveStorage::Filename 对象。但我不确定他为什么在那里使用 .blob 。我不需要它,但也许有一个很好的理由。