在 Express 服务器上上载期间使用用户定义的名称重命名文件
Rename file with user-defined name during upload on Express server
我是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-busboy
从hiddenField
输入中获取值:
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
事件。
相关文章:
- Meteor-添加用户自定义字段的方法不起作用
- 如何在用户按下F5键或单击浏览器时显示自定义的fancybox's后退/关闭按钮
- Can用户'MediaWiki上的自定义JavaScript调用Lua模块
- 如何获取用户's输入并返回我定义的匹配变量的值
- 使用具有用户定义字段的新请求者创建新的Zendesk票证
- jquery返回ajax响应和用户定义的变量到函数
- 阻止用户在Netsuite中使用标准/未自定义的表单
- 如何使用用户定义的值来增加Javascript中的值
- Angular 2中组件的自定义用户模板
- 从自定义用户控件更新contenttemplate下页面中控件的id
- 从 JQuery 添加 asp.net 自定义用户控件
- 将自定义用户代理关联到特定的谷歌浏览器页面/标签页
- 当使用ajax请求时,是否可以自定义用户代理参数
- 为什么人们要在jQuery对象中添加自己的自定义/用户函数
- 护照JWT要求.在我的一条路由中没有定义用户
- 用自定义用户界面设备钩入openseaddragon
- 自定义用户HTML输入安全性
- 扩展解析.用户转换为自定义用户类
- 如何将自定义用户数据添加到流星帐户
- Alfresco ECM的自定义用户界面