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