在 Express 服务器上上载期间使用用户定义的名称重命名文件

Rename file with user-defined name during upload on Express server

本文关键字:定义 用户 文件 重命名 服务器 Express 上载      更新时间:2023-09-26

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

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

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

这是服务器端代码:

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

感谢您的任何帮助。

如果你不需要使用 formidable ,你可以使用 connect-busboy 从 'POST' 请求中获取字段名称。对于以这种方式定义的表单字段:

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

您可以使用connect-busboyhiddenField输入中获取值:

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

必须在file事件之前处理field事件。