【问题标题】:Rename file with user-defined name during upload on Express server在 Express 服务器上上传期间使用用户定义的名称重命名文件
【发布时间】:2016-05-08 22:04:49
【问题描述】:

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

感谢您的帮助。

【问题讨论】:

  • 你能发布所有的服务器端代码吗?有些部分似乎丢失了。
  • 我刚刚删除了 'require' 语句。他们是: 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 })

标签: javascript node.js express asynchronous


【解决方案1】:

如果你不需要使用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
    });
});

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

【讨论】:

  • 哦,非常感谢!如果我知道这有这么简洁的答案...太好了!
  • 它怎么知道它应该先执行第一个'req.busboy.on'然后再执行另一个?
  • 它依赖于您定义输入表单的顺序。如果在文本输入表单之前使用文件输入表单,则需要在 'field' 事件之前处理 'file' 事件。
猜你喜欢
  • 2017-09-27
  • 1970-01-01
  • 2014-12-19
  • 2012-11-24
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 2017-05-18
相关资源
最近更新 更多