使用强大的文件名parsing表单值

我使用强大的处理我的file upload在NodeJs。 我有点坚持parsing字段值。

如何获取project_id的值到表单处理程序,所以我可以写在我的文件名参数?

<input type="text" id="project_id" value="{{projects._id}}" readonly> 

编辑

更具体地说,这里是我的表单上传处理的详细视图:

 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; 

我可以在form.parse部分loggingvar project 。 但是我没有得到form.on('end'...部分的variables。

HTML表单

 <form id="uploadForm" enctype="multipart/form-data" action="/uploads/" method="post"> <input type="text" name="project_id" id="project_id" value="{{projects._id}}" readonly> <input multiple="multiple" type="file" name="upload" /> <button type="submit">Upload</button> </form> 

Formidable的endcallback没有使用任何参数,但我不确定你甚至需要调用它,如果你正在使用parsecallback。 我想你要找的是这样的:

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

如果您select不使用parsecallback,则需要监听end()事件,如下所示:

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

客户端脚本:

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

服务器端脚本:

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

只要记住一点,将参数发送到formData()的顺序应该与上面提到的代码相同,因为file upload需要path上传到命令。