HTML5之fileAPI使得咱们处理图片上传更加简单。html
html代码前端
<div class="form-group"> <label for="modal_inputFile" class="col-md-3 control-label label-font">位置图:</label> <div class="col-md-9"> <input type="text" readonly="" class="form-control" placeholder="点击选择文件"> <input type="file" id="modal_inputFile"> <img src="" class="img-responsive" id="modal-pre" alt="预览区" style="max-height: 300px"> </div> </div>
效果:
html5
这里咱们能够经过$("#modal_inputFile")[0].files[0]
来获取到图片的信息。
node
这里有name
,size
,type
这几个咱们经常使用的属性。git
选择好图片后,咱们都但愿会有个预览功能。这个html5也为咱们想到了。github
他提供了FileReader这个新的对象给咱们。ajax
FileReader该接口主要用来把文件读入内存,而且读取文件中的数据。json
这样咱们就能够经过date url来实现预览了。后端
var file = document.getElementById(modal_inputFile'').files[0]; if (!file) { return false; } var reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function(e) { var ib_pre = document.getElementById('modal-pre'); ib_pre.src = this.result; }
这样就实现了预览。
浏览器
咱们再来查看下img的src。
<img src="data:image/png;base64,iVBORXXXXXXXXXXXXX....XXXXXXX" class="img-responsive" id="modal-pre" alt="预览区" style="max-height: 300px">
src是base64编码。
具体可见:HTML5权威指南--标签新变化,文件API,拖放API(简要学习笔记一)
既然前端使用文件API能知足咱们的需求,那咱们接下来就须要上传到服务端了。当仁不让的就是NodeJs了。
下面是前端发起请求的例子:
//图片上传 $('#preUpload').on('click', function(e) { var data = new FormData(); var _files = $("#modal_inputFile")[0].files[0]; var ect = ($("#modal_inputFile")[0].files[0]).name.split('.')[1]; if(ect !== 'png'){ alert('请上传png图片!') return; } data.append("modal_file", _files); $.ajax({ type: 'post', dataType: 'json', url: window.stnt_hosts + 'thirdAdmanage/upload/modal', data: data, contentType: false, processData: false }).done(function(data, status) { console.log('上传成功'); }).fail(function(err) { console.log('上传失败'); }) })
这里经过FormData来处理咱们须要上传的数据。
这里的data数据是一个序列过的对象。后台接受就好了。
服务端咱们使用node-formidable来处理图片的保存等操做。
见代码:
var formidable = require("formidable"); var form = new formidable.IncomingForm(); //临时目录 form.uploadDir = './upload/'; //预览图片上传 router.post('/upload/modal', function(req, res, next) { form.parse(req, function(err, fields, files) { if (files.modal_file) { rename(files.modal_file.path, files.modal_file.name, 'preview') res.send({ stats:'success', data:[] }) } }) }); function rename(old, _new, code, bId) { var path = './upload/' + code + '/'; fs.exists(path, function(exists) { if (!exists) { fs.mkdir(path) console.log('建立文件夹!') } fs.renameSync(old, path + _new, function(err) { if (err) { console.log(err); return; } console.log('上传成功!') }) }) }
这里使用fs.renameSync
的缘由是,咱们里面设置的临时目录form.uploadDir是存在于内存中的数据,并非真正的图片。
相似这样
咱们须要经过fs的方法,将文件从新保存到咱们须要的地方便可。这时候就是图片了。
这里的form.parse(req, function(err, fields, files)
中的fields
与files
究竟是什么对象,必定要本身调试着看。看完你就明白是什么了。
以前我不清楚的时候就是打开浏览器就搜索,结果可想而知很惨,几乎全是错的。
因此不清楚的话必定要去查github。
还有app.use(bodyParser.urlencoded({ extended: true }));
的做用是用来解析咱们一般的form表单提交的数据,也就是请求头中包含这样的信息: Content-Type: application/x-www-form-urlencoded
app.use(bodyParser.json())
是用来解析json的。
具体关于bodyParser的见这位博友的文章bodyParser中间件的研究。