Analizar el valor de la forma con formidable al nombre de archivo

Estoy usando formidable para manejar mis archivos subidos en NodeJs. Estoy un poco atascado en el análisis de valores de campo.

¿Cómo obtengo el valor de project_id para el controlador de formularios, para poder escribir el parámetro en mi nombre de archivo?

 

EDITAR

Para ser más específico, aquí hay una vista detallada de mi manejo de envío de formularios:

 app.post('/uploads/', function (req, res){ var form = new formidable.IncomingForm(); form.parse(req, function (err, fields, files) { res.writeHead(200, {'content-type': 'image/jpeg'}); res.write('received upload: \n\n'); var project = fields.project_id; res.end(util.inspect(project, {fields: fields, files: files})); }); form.on('end', function(project, fields, files){ console.log(project); /*Temporary location of our uploaded file */ var temp_path = this.openedFiles[0].path; /*The file name of the uploaded file */ var file_name = project + '.' + this.openedFiles[0].name; 

Puedo registrar el var project en la parte form.parse . Pero no obtengo la variable en la form.on('end'... parte.

Formulario HTML

      

La callback end de Formidable no toma ningún parámetro, pero no estoy seguro de que necesites llamarla si estás usando la callback de parse . Creo que lo que estás buscando es algo como esto:

 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(); }); }); }); 

Necesitaría escuchar el evento end() si elige no usar la callback de parse , como esto:

 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(); }); 

Guión del lado del cliente:

  //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) { } }) 

Script del lado del servidor:

 var fileDir = path.join(__dirname, '/../uploads'); // create an incoming form object var 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); 

Solo tenga en cuenta una cosa que la secuencia de envío de parámetros a formData () debe ser la misma que se menciona en el código anterior, ya que la carga del archivo necesita una ruta para subir al destino.