Parse form value with formidable to filename
Formidable's end
callback doesn't take any parameters, but I'm not sure you even need to call it if you're using the parse
callback. I think what you're looking for is something like this:
var fs = require('fs');app.post('/uploads', function(req, res, next) { var form = new formidable.IncomingForm(); form.parse(req, function(err, fields, files) { if (err) next(err); // TODO: make sure my_file and project_id exist fs.rename(files.my_file.path, fields.project_id, function(err) { if (err) next(err); res.end(); }); });});
You would need to listen for the end()
event if you chose not to use the parse
callback, like this:
new formidable.IncomingForm().parse(req) .on('file', function(name, file) { console.log('Got file:', name); }) .on('field', function(name, field) { console.log('Got a field:', name); }) .on('error', function(err) { next(err); }) .on('end', function() { res.end(); });
Client side script:
//Upload the file var fd = new FormData(); //Take the first selected file fd.append("dbDocPath", 'invoices/' + file.name); fd.append("file", file); $http({ method: 'POST', url: $rootScope.apiUrl + 'uploadDocToServer', data: fd, headers: { 'Content-Type': undefined }, //prevents serializing payload. don't do it. transformRequest: angular.identity, }).success(function (response) { if (response.success) { } })
Server side script:
var fileDir = path.join(__dirname, '/../uploads');// create an incoming form objectvar form = new formidable.IncomingForm();var dbDocPath = '';form.parse(req) .on('field', function (name, field) { //console.log('Got a field:', field); //console.log('Got a field name:', name); dbDocPath = field; }) .on('file', function (name, file) { //console.log('Got file:', name); // specify that we want to allow the user to upload multiple files in a single request //form.multiples = true; // store all uploads in the /uploads directory form.uploadDir = fileDir; fs.rename(file.path, path.join(form.uploadDir, file.name)); // every time a file has been uploaded successfully, // rename it to it's orignal name var bucket = new AWS.S3(); //console.log(dbDocPath); var params = { Bucket: DocsConfig.bucketName, Key: dbDocPath, Body: fs.createReadStream(path.join(form.uploadDir, file.name)), ACL: 'public-read' }; bucket.putObject(params, function (perr, pres) { if (perr) { //console.log("Error uploading data: ", perr); } else { fs.unlinkSync(path.join(form.uploadDir, file.name)); //console.log("Successfully uploaded data", pres); } }); }) .on('error', function (err) { res.send({'success': false, error: err}); }) .on('end', function () { res.send({'success': true}); });// parse the incoming request containing the form data//form.parse(req);
Just keep one thing in mind that the sequence of sending parameters to formData() should be same as mentioned in above code as file upload needs path to upload to the destiny.