使用Node Express做图片上传功能,会经常用到formidable这个库,老版本的Node对图片上传的功能是比较难处理的,有了formidable这一切都简单多了,只需要如下的一段简单的代码就可以完成图片的上传
//保存上传的文件
saveUploadFile: function(req, dirname, callback){
var userDirPath = Path.resolve(this.MAIN+dirname);
var form = new formidable.IncomingForm(); //创建上传表单
form.encoding = 'utf-8'; //设置编辑
form.uploadDir = userDirPath; //设置上传目录
form.keepExtensions = true; //保留后缀
form.maxFieldsSize = 2 * 1024 * 1024; //文件大小
form.type = true;
var displayUrl;
form.parse(req, function(err, fields, files) {
if (err) {
callback(false, "上传失败");
return;
}
var extName = ''; //后缀名
switch (files.file.type) {
case 'image/pjpeg':
extName = 'jpg';
break;
case 'image/jpeg':
extName = 'jpg';
break;
case 'image/png':
extName = 'png';
break;
case 'image/x-png':
extName = 'png';
break;
default:
extName = files.file.name.substring(files.file.name.lastIndexOf("."));
break;
}
if (extName.length === 0) {
callback(false, 2023); //文件格式错误
return;
} else {
var picName = fields.name || Date.now();
var avatarName = '/' + picName + '.' + extName;
var newPath = form.uploadDir + avatarName;
fs.renameSync(files.file.path, newPath); //重命名
callback(true, dirname+avatarName);
}
});
},
但是在编译的时候却会遇到一个非常棘手的问题,编译器报出了如下的错误:

/Users/yanglidong/Documents/Work/Company/Git/YLD/samyoc/dist/server/server.js:257847
var crypto = require('crypto');
^
TypeError: require is not a function
at Object.map../file (/Users/yanglidong/Documents/Work/Company/Git/YLD/samyoc/dist/server/server.js:257847:15)
从这里TypeError: require is not a function我们可以看出,我们在模块应用的require函数无效了,说它不是一个函数。这是个很无厘头的问题,即不是代码问题也不是环境问题,找遍了所有地方也没找到问题。最后在Stack Overflow上找到提示。
要解决这个问题只需要在webconfig文件中,添加定义"global.GENTLY": false,因为formidable库是有使用到GENTLY库的。
var serverConfig = {
plugins: [
new webpack.DefinePlugin({
"global.GENTLY": false,
'__isServer__': true,
'__isClient__': false,
'_isDevelopment_': true,
location: {
origin: "'http://localhost:3001'"
}
}),
.
.
.
};