I am trying to combine ng-file-upload and carrierwave to upload multiple files, but the server side controller only gets one file (the last element of the selected files).
Client side ( link )
HTML
<button type="file" ng-model="files" ngf-select ngf-multiple="true">Upload</button>
Js
var upload = function (files, content) { return Upload.upload({ url: 'MY_CONTROLLER_URL', file: files,
console.log(files) prints an array of [File, File, ...] (Browser: FireFox). Thus, on the client side, it receives the selected files. The GitHub ng-file-upload page says that it supports an array of files for html5 .
Server side ( link )
posts_controller.rb
def create @post = Post.new(post_params) @post.attaches = params[:file] @post.save render json: @post end private def post_params params.require(:post).permit(:content, :file) end
where @post.attaches are message attachments, and params[:file] sent from the client side with the file parameter in Upload.upload .
I want to save an array of files in @post.attaches , but params[:file] contains only one file from the selected files. puts params[:file] Prints:
#<ActionDispatch::Http::UploadedFile:0x007fddd1550300 @tempfile=#<Tempfile:/tmp/RackMultipart20150812-2754-vchvln.jpg>, @original_filename="Black-Metal-Gear-Rising-Wallpaper.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"Black-Metal-Gear-Rising-Wallpaper.jpg\"\r\nContent-Type: image/jpeg\r\n">
This shows that there is only one file in params[:file] . I am not sure if there is anything wrong with using this parameter.
How can I solve this problem?
Below is my post.rb model and attach_uploader.rb (created by carrierwave ) for reference:
post.rb
class Post < ActiveRecord::Base mount_uploaders :attaches, AttachUploader end
attach_uploader.rb
class AttachUploader < CarrierWave::Uploader::Base storage :file def store_dir "uploads/
and @post.attaches is added to posts database
rails g migration add_attaches_to_posts attaches:json