I have the below request in python
import requests, json, io
cookie = {}
payload = {\"Name\":\"abc\"}
url = \"/test\"
file = \"out/test.json\"
fi = {\'file
here is my solution:
// Controller
$scope.uploadImg = function( files ) {
$scope.data.avatar = files[0];
}
$scope.update = function() {
var formData = new FormData();
formData.append('desc', data.desc);
formData.append('avatar', data.avatar);
SomeService.upload( formData );
}
// Service
upload: function( formData ) {
var deferred = $q.defer();
var url = "/upload" ;
var request = {
"url": url,
"method": "POST",
"data": formData,
"headers": {
'Content-Type' : undefined // important
}
};
console.log(request);
$http(request).success(function(data){
deferred.resolve(data);
}).error(function(error){
deferred.reject(error);
});
return deferred.promise;
}
// backend use express and multer
// a part of the code
var multer = require('multer');
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, '../public/img')
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + '.jpg');
}
})
var upload = multer({ storage: storage })
app.post('/upload', upload.single('avatar'), function(req, res, next) {
// do something
console.log(req.body);
res.send(req.body);
});
<div>
<input type="file" accept="image/*" onchange="angular.element( this ).scope().uploadImg( this.files )">
<textarea ng-model="data.desc" />
<button type="button" ng-click="update()">Update</button>
</div>
I had similar problem when had to upload file and send user token info at the same time. transformRequest
along with forming FormData
helped:
$http({
method: 'POST',
url: '/upload-file',
headers: {
'Content-Type': 'multipart/form-data'
},
data: {
email: Utils.getUserInfo().email,
token: Utils.getUserInfo().token,
upload: $scope.file
},
transformRequest: function (data, headersGetter) {
var formData = new FormData();
angular.forEach(data, function (value, key) {
formData.append(key, value);
});
var headers = headersGetter();
delete headers['Content-Type'];
return formData;
}
})
.success(function (data) {
})
.error(function (data, status) {
});
For getting file $scope.file
I used custom directive:
app.directive('file', function () {
return {
scope: {
file: '='
},
link: function (scope, el, attrs) {
el.bind('change', function (event) {
var file = event.target.files[0];
scope.file = file ? file : undefined;
scope.$apply();
});
}
};
});
Html:
<input type="file" file="file" required />