node上传文件
nodejs上传文件取不到数据?
nodejs上传文件req.body
是个空的?
这些问题我都遇到了,哈哈哈
nodejs上传文件功能,搞了两天了,一直搞不好,用谷歌大法也研究了好久,我就是不行
今天终于搞好了,但是我还是不知道,前面这么久我到底哪里搞错了,
前端
<input type="file" class="uploader" id="file" name="file" accept="image/*" multiple>
本来使用base64上传的,但是无奈,传输的数据太大,上传不了
只好使用FormData
,就这个鸡毛玩意,搞了两天了,一直不行
//监听文件
$('.uploader').change(function () {
// 获取当前选中的文件
var file = this.files; //读取文件
var form = new FormData();
//这里一定加个index,file[0],我就是测试好多遍,一开始直接写file,横竖都不行
// 或者多图上传用each遍历,
form.append("file",file[0]);
console.log(form);
$.ajax({
type:'post',
url: "/upload",
data:form,
contentType: false, // 注意这里应设为false
processData: false, //false
cache: false, //缓存
success: function(r){
}
})
})
后端
后端框架我是用的express
,
使用中间件上传,由于FormData
上传是2进制字符串上传的,直接是取不到数据的,会返回个空对象{}
,
前面我并不知道要用其他东西辅助上传,不管怎么弄都是一个空的对象,搞死了
一开始用的connect-multiparty
这个中间件,但是没能搞定
于是这里我使用的是formidable
中间件,也有很多其他的,大同小异,能用就行
formidable
这个也试了很多次,前面几次都不行,最后经我百般调试,居然可以了
先安装formidable
$ npm install formidable
调用formidable
var formidable = require('formidable');
/* 添加文章 */
router.post('/upload', function(req, res, next) {
var form = new formidable.IncomingForm(); //创建上传表单
form.encoding = 'utf-8'; //设置编辑
// form.uploadDir = 'public/avatar/'; //设置上传目录
form.keepExtensions = true; //保留后缀
form.maxFieldsSize = 2 * 1024 * 1024; //文件大小
form.parse(req, function(err, fields, files) {
// console.log(fields);
if (err) {
return;
}
console.log(files.file);
///
////
/////
//////在这里可以做大事情了.....
});
不使用中间件的话,首先取不到数据,更打印不出来
打印出来的file
信息,
其中path
就是关键了,我要的就是path,path是上传的缓存路径
{ file:
File {
_events: {},
_eventsCount: 0,
_maxListeners: undefined,
size: 38160,
path:
'C:\\Users\\admin\\AppData\\Local\\Temp\\upload_68dcab3f773f0152bab5bf87fe0f3ed3.jpg',
name: 'timg (3).jpg',
type: 'image/jpeg',
hash: null,
lastModifiedDate: 2018-11-01T05:36:46.212Z,
_writeStream:
WriteStream {
_writableState: [WritableState],
writable: false,
_events: {},
_eventsCount: 0,
_maxListeners: undefined,
path:
'C:\\Users\\admin\\AppData\\Local\\Temp\\upload_68dcab3f773f0152bab5bf87fe0f3ed3.jpg',
fd: null,
flags: 'w',
mode: 438,
start: undefined,
autoClose: true,
pos: undefined,
bytesWritten: 38160,
closed: false } } }
相关更多问题请使用谷歌大法进入深成研究:谷歌大法传送门