折腾到现在,尝试了,express-formidable, busboy, formidable, multer … 但是都无法在工程中保存上传的图片文件,数据库用的是mongoose,数据库中有图片记录,就是在工程中找不到,谁有办法?
上传文件用的 form 加 enctype=‘multipart/form-data’ 了吗?另外 multer 里面的 single 跟 array 接受的是 input 元素的 name。
工程中找不到…你设置的文件存储路径在哪里
之前我的问题描述可能太简短了,具体是这样的: 工程是webpack+react+express+mongo,借鉴了@nswbmw 《一起学 Node.js》中上传文件的方式,所以我使用了 app.use(require(‘express-formidable’)({ uploadDir: path.join(__dirname, ‘/public/img’), keepExtensions: true })); 我的form写在了react组件中,表格加上了这句encType="multipart/form-data"之后就会报错 : Uncaught Error: _registerComponent(…): Target container is not a DOM element.(…) 网上说错误原因是js在头部引用了,但是我的js文件是在底部引用的。 我尝试去掉encType="multipart/form-data"这句话之后,没有报错,而且mongo数据库中也能找到上传的信息,但是图片没有上传到工程中。 @nswbmw 《一起学 Node.js》没有使用webpack和react。 谁有使用过webpack+react+express+mongo上传图片的方法啊?
好巧,我在express中用的formidable上传的图片,用express-formidable失败了 http://www.tuicool.com/articles/F7JrMjj 这个帮了我很多
@mengLLLL 非常感谢!帮了很大忙!现在我可以上传文件了,但是写入mongodb中遇到了问题,在route文件中的代码是: router.post(’/profile’,function(req,res,next){ var form = new formidable.IncomingForm(); //创建上传表单 form.encoding = ‘utf-8’; //设置编辑 form.uploadDir = __dirname+’/public/img/’; //设置上传目录 form.keepExtensions = true; //保留后缀 form.maxFieldsSize = 2 * 1024 * 1024; //文件大小
form.parse(req, function(err, fields, files) { if (err) { res.locals.error = err; res.render('index', { title: TITLE }); return; } var bookData={ bookname: fields.bookname, bookimg: files[0], bookdesc: fields.bookdesc } Book.create(bookData,function(error,book){ if(error){ return next(error) }else{ return res.redirect('/'); } }) }); res.locals.success = '上传成功'; res.render('index', { title: TITLE });
}); 其中这部分代码: var bookData={ bookname: fields.bookname, bookimg: files[0], bookdesc: fields.bookdesc } bookname和bookdesc都可以写到mongo中,但是bookimg,也就是图片该怎么写到mongo中呢?
关于如何在react+webpack+express+mongo工程中上传图片并保存在数据库中的问题终于解决了,首先react组件中的表单一定要添加encType="multipart/form-data"这句话,表单中上传代码:<input type=“file” name=“my_file” id=“my_file” className=“form-control”></input> 这句话一定不要忘记name的设置,这里name值是my_file。 route中的完整代码如下: ‘use strict’; var express=require(‘express’); var router=express.Router(); var Book=require(’…/models/book.js’); var formidable = require(‘formidable’), fs = require(‘fs’), TITLE = ‘formidable上传示例’, AVATAR_UPLOAD_FOLDER = ‘/img/’; __dirname = process.cwd(); router.post(’/profile’,function(req,res,next){ var form = new formidable.IncomingForm(); //创建上传表单 form.encoding = ‘utf-8’; //设置编辑 form.uploadDir = __dirname+’/public/img/’; //设置上传目录 form.keepExtensions = true; //保留后缀 form.maxFieldsSize = 2 * 1024 * 1024; //文件大小
form.parse(req, function(err, fields, files) { if (err) { res.locals.error = err; res.render('index', { title: TITLE }); return; } var extName = ''; //后缀名 switch (files.my_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; } if(extName.length == 0){ res.locals.error = '只支持png和jpg格式图片'; res.render('index', { title: TITLE }); return; } var avatarName = Math.random() + '.' + extName; var newPath = form.uploadDir + avatarName; console.log(newPath); fs.renameSync(files.my_file.path, newPath); var bookData={ bookname: fields.bookname, bookimg: newPath, bookdesc: fields.bookdesc } Book.create(bookData,function(error,book){ if(error){ return next(error) }else{ // 这里如果res 会报错 // return res.redirect('/'); } }) }); res.locals.success = '上传成功'; res.render('index', { title: TITLE });
});
哈哈,好开心可以帮到你 解决就好,我其实也很小白😂
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
上传文件用的 form 加 enctype=‘multipart/form-data’ 了吗?另外 multer 里面的 single 跟 array 接受的是 input 元素的 name。
工程中找不到…你设置的文件存储路径在哪里
之前我的问题描述可能太简短了,具体是这样的: 工程是webpack+react+express+mongo,借鉴了@nswbmw 《一起学 Node.js》中上传文件的方式,所以我使用了 app.use(require(‘express-formidable’)({ uploadDir: path.join(__dirname, ‘/public/img’), keepExtensions: true })); 我的form写在了react组件中,表格加上了这句encType="multipart/form-data"之后就会报错 : Uncaught Error: _registerComponent(…): Target container is not a DOM element.(…) 网上说错误原因是js在头部引用了,但是我的js文件是在底部引用的。 我尝试去掉encType="multipart/form-data"这句话之后,没有报错,而且mongo数据库中也能找到上传的信息,但是图片没有上传到工程中。 @nswbmw 《一起学 Node.js》没有使用webpack和react。 谁有使用过webpack+react+express+mongo上传图片的方法啊?
好巧,我在express中用的formidable上传的图片,用express-formidable失败了 http://www.tuicool.com/articles/F7JrMjj 这个帮了我很多
@mengLLLL 非常感谢!帮了很大忙!现在我可以上传文件了,但是写入mongodb中遇到了问题,在route文件中的代码是: router.post(’/profile’,function(req,res,next){ var form = new formidable.IncomingForm(); //创建上传表单 form.encoding = ‘utf-8’; //设置编辑 form.uploadDir = __dirname+’/public/img/’; //设置上传目录 form.keepExtensions = true; //保留后缀 form.maxFieldsSize = 2 * 1024 * 1024; //文件大小
}); 其中这部分代码: var bookData={ bookname: fields.bookname, bookimg: files[0], bookdesc: fields.bookdesc } bookname和bookdesc都可以写到mongo中,但是bookimg,也就是图片该怎么写到mongo中呢?
关于如何在react+webpack+express+mongo工程中上传图片并保存在数据库中的问题终于解决了,首先react组件中的表单一定要添加encType="multipart/form-data"这句话,表单中上传代码:<input type=“file” name=“my_file” id=“my_file” className=“form-control”></input> 这句话一定不要忘记name的设置,这里name值是my_file。 route中的完整代码如下: ‘use strict’; var express=require(‘express’); var router=express.Router(); var Book=require(’…/models/book.js’); var formidable = require(‘formidable’), fs = require(‘fs’), TITLE = ‘formidable上传示例’, AVATAR_UPLOAD_FOLDER = ‘/img/’; __dirname = process.cwd(); router.post(’/profile’,function(req,res,next){ var form = new formidable.IncomingForm(); //创建上传表单 form.encoding = ‘utf-8’; //设置编辑 form.uploadDir = __dirname+’/public/img/’; //设置上传目录 form.keepExtensions = true; //保留后缀 form.maxFieldsSize = 2 * 1024 * 1024; //文件大小
});
哈哈,好开心可以帮到你 解决就好,我其实也很小白😂