Javascript 在Express server上上载时使用用户定义的名称重命名文件

Javascript 在Express server上上载时使用用户定义的名称重命名文件,javascript,node.js,express,asynchronous,Javascript,Node.js,Express,Asynchronous,我是node.js的新手。 我知道这似乎是一个重复的问题,但我看了很多相关的主题,并尝试了很多,但这是如此复杂 我在服务器端使用Node.js上传文件并重命名它。文件的新名称来自表单中某个隐藏字段中的客户端。 问题是,新名称出现在一个异步函数中,而文件则写入另一个异步函数,因此在将文件写入流时,该名称不可用 我尝试将第二个调用嵌套在第一个调用的回调函数中,但它不再触发。 我也尝试了async.瀑布,但没有成功 以下是服务器端代码: //--------------------------init

我是node.js的新手。 我知道这似乎是一个重复的问题,但我看了很多相关的主题,并尝试了很多,但这是如此复杂

我在服务器端使用Node.js上传文件并重命名它。文件的新名称来自表单中某个隐藏字段中的客户端。 问题是,新名称出现在一个异步函数中,而文件则写入另一个异步函数,因此在将文件写入流时,该名称不可用

我尝试将第二个调用嵌套在第一个调用的回调函数中,但它不再触发。 我也尝试了async.瀑布,但没有成功

以下是服务器端代码:

//--------------------------initializing:--------------------------
var express = require('express');
var busboy = require('connect-busboy');
var path = require('path');
var fs = require('fs-extra');
var bodyParser = require('body-parser');
var formidable = require('formidable'); 
var urlencodedParser = bodyParser.urlencoded({ extended: true }) 
var app = express();

app.use(bodyParser());
app.use(busboy());
app.use(express.static(__dirname ));

app.get('/', function(req, res,next) {
      res.sendFile(__dirname + '/a.html');
});

var server = app.listen(SERVER_PORT, function() {
    console.log('Listening on port %d', server.address().port);
});

//------------------Here is the main code : ----------------------
//UPLOAD is not logged.
app.post('/upload', function(req, res){

    var form = new formidable.IncomingForm();
    var fstream;
    req.pipe(req.busboy);
    var newName ;
    form.parse(req, function(err, fields, files) {  
       newName = fields.hiddenField;
       console.log('PARSE');
       req.busboy.on('file', function (fieldname, file, filename) {
           console.log('UPLOAD');
           fstream = fs.createWriteStream(__dirname + '/img/' + newName + '.jpg');
           file.pipe(fstream);
           fstream.on('close', function () {                 
               res.redirect('back');   
           });        //where to go next
       });
   });    
});    

感谢您的帮助。

如果您不需要使用
强大
,您可以使用
connect busboy
从“POST”请求中获取字段名。对于以这种方式定义的表单字段:

<input type="text" name="hiddenField" />
<input type="file" name="fileUpload" />

字段
事件必须在
文件
事件之前处理。

可以发布所有服务器端代码吗?有些部分似乎丢失了。我刚刚删除了“require”语句。它们是:var express=require('express');var-busboy=require('connect-busboy');var path=require('path');var fs=需要('fs-extra');var bodyParser=require('body-parser');var Required=要求(“Required”);var urlencodedParser=bodyParser.urlencoded({extended:true})噢,非常感谢!如果我知道这有这么一个简洁的答案。。。伟大的它如何知道它应该首先执行第一个'req.busboy.on',然后执行另一个?它取决于您定义输入表单的顺序。如果在文本输入窗体之前使用文件输入窗体,则需要在“字段”事件之前处理“文件”事件。
var newName = null;

app.post('/upload', function(req, res) {

    req.pipe(req.busboy);
    // fieldName is 'hiddenField'
    req.busboy.on('field', function(fieldname, val) {
      newName = val;
    });

    req.busboy.on('file', function (fieldname, file, filename) {
        // fieldname is 'fileUpload'
        var fstream = fs.createWriteStream(__dirname + '/img/' + newName + '.jpg');
        file.pipe(fstream);
        fstream.on('close', function () {
            res.redirect('back');
        });      //where to go next
    });
});