angularjs - How to upload files using multiple files input element? -
i'm trying upload multiple files multiple input element in 1 form.
for exemple :
<form id="category-form" method="post" enctype="multipart/form-data" class="form" name="form"> <div class="form-group"> <p>pictures of category</p> <input id="a_pics" accept="image/*" type="file" class="file" multiple="true" my-file-upload="a_pics" required/> </div> <div class="form-group"> <p>pictures of b category</p> <input id="b_pics" accept="image/*" type="file" class="file" multiple="true" my-file-upload="b_pics" required/> </div> </form>
i have service file upload. this, can know input element comes from.
.service('fileservice', function () { var file = {}; var fileservice = {}; fileservice.getfile = function (name) { return file[name]; }; fileservice.setfile = function (newfile, index, name) { if (index === 0 && file[name] === undefined) file[name] = []; file[name][index] = newfile; }; return fileservice; }) .directive('myfileupload', function (fileservice) { return function (scope, element, attrs) { element.bind('change', function () { var index; var index_file = 0; (index = 0; index < element[0].files.length; index++) { fileservice.setfile(element[0].files[index], index_file, attrs.myfileupload); index_file++; } index_file = 0; }); } });
until there, works well. got map of category/files. but, when upload server, need :
var a_pics = fileservice.getfile($scope.a_pics); var b_pics = fileservice.getfile($scope.b_pics); var option = { transformrequest: angular.identity, headers: {'content-type': plan_pics.type} }; var fd = new formdata(); var index; (index = 0; index < a_pics.length; index++) fd.append('file', a_pics[index]); (index = 0; index < b_pics.length; index++) fd.append('file', b_pics[index]); $http.post('/api/projects', fd, option);
so when server receive this, cannot know category of file. got this:
[{ fieldname: 'file', originalname: 'a_cat.png', name: 'f771ac79f61dbdbf6fe689f593939ac5.png', encoding: '7bit', mimetype: 'image/png', path: 'client/assets/images/f771ac79f61dbdbf6fe689f593939ac5.png', extension: 'png', size: 8185, truncated: false, buffer: null }, { fieldname: 'file', originalname: 'a_cat (1).png', name: '830dc77921461b10fecf35004fc00724.png', encoding: '7bit', mimetype: 'image/png', path: 'client/assets/images/830dc77921461b10fecf35004fc00724.png', extension: 'png', size: 12192, truncated: false, buffer: null }, { fieldname: 'file', originalname: 'b_cat_8.jpg', name: '39f3bd6a7204ac5fdf114a870ece9f50.jpg', encoding: '7bit', mimetype: 'image/jpeg', path: 'client/assets/images/39f3bd6a7204ac5fdf114a870ece9f50.jpg', extension: 'jpg', size: 98143, truncated: false, buffer: null }]
i tried add field in file object. doesn't work. have got suggestion? i'm using angular, express, multer , node.
you need call file fields different things different categories, example:
var a_pics = fileservice.getfile($scope.a_pics); var b_pics = fileservice.getfile($scope.b_pics); var option = { transformrequest: angular.identity, headers: {'content-type': plan_pics.type} }; var fd = new formdata(); var index; (index = 0; index < a_pics.length; index++) fd.append('files_a', a_pics[index]); (index = 0; index < b_pics.length; index++) fd.append('files_b', b_pics[index]); $http.post('/api/projects', fd, option);
then you'll 2 different field names in submitted data, , can handle appropriately in server code.
Comments
Post a Comment