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

时间:2018-11-27 18:12:13

标签: ruby-on-rails rails-activestorage ruby-on-rails-5.2

我试图在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 %>

我已经尝试按照here的描述访问params[:upload][files]并在其上调用.original_filename,但收到错误NoMethodError: undefined method `original_filename' for #<String:0x007fac77fd18c8>

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

3 个答案:

答案 0 :(得分:1)

在附加文件后,我终于可以通过执行file.blob.filename来获取文件名。

答案 1 :(得分:1)

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

file.filename.to_s

就我而言,我有一个带有

的模型
has_one_attached :file

OP的情况略有不同,您的情况也可能有所不同,因此请进行相应调整。

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

答案 2 :(得分:0)

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

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

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

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