使用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'" } }), . . . };