2018/1/15

Rails - 多檔上傳

假設有一個 Controller 叫做 imgur,大概是這樣:

rails g scaffold imgur pictures

而 Controller 內的 params 只允許傳遞 pictures 陣列:

def imgur_params
  params.require(:imgur).permit(pictures: [])
end

一個最基本的檔案上傳表單長這樣:

<%= form_for(imgur) do |f| %>
  <%= f.file_field :pictures %>
  <%= f.submit %>
<% end %>

會因為 pictures 只吃陣列的關係,就傳不進去。如果想要上傳多個檔案,要加上 multiple: true

<%= form_for(imgur) do |f| %>
  <%= f.file_field :pictures, multiple: true %>
  <%= f.submit %>
<% end %>

可以使用多個 f.file_field 來做上傳:

<%= form_for(imgur) do |f| %>
  <%= f.file_field :pictures, multiple: true %>
  <%= f.file_field :pictures, multiple: true %>
  <%= f.submit %>
<% end %>

如果想要改用 file_field_tag 的話,就必須在 form_for 加上 multipart: true

<%= form_for(imgur, html: { multipart: true }) do |f| %>
    <%= file_field_tag "imgur[pictures][]" %>
    <%= f.submit %>
<% end %>

加上 [] 之後,即使只傳一個檔也能通過 params.permit

如果想要多檔上傳:

<%= form_for(imgur, html: { multipart: true }) do |f| %>
    <%= file_field_tag "imgur[pictures][]", multiple: true %>
    <%= f.submit %>
<% end %>

也可以這樣:

<%= form_for(imgur, html: { multipart: true }) do |f| %>
    <%= file_field_tag "imgur[pictures][]" %>
    <%= file_field_tag "imgur[pictures][]" %>
    <%= f.submit %>
<% end %>

或者這樣:

<%= form_for(imgur, html: { multipart: true }) do |f| %>
    <%= file_field_tag "imgur[pictures][]", multiple: true %>
    <%= file_field_tag "imgur[pictures][]", multiple: true %>
    <%= f.submit %>
<% end %>

沒有留言: