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 %> ```

沒有留言: