在 上一篇 已经实现了图片预览,那么如何上传图片呢?有两种思路:html
一、将图片转化为dataURL(base64),这样就成为了一串字符串,再传到服务端。不过这样缺点不少,数据量比转换以前增长1/3,并且会增长了存储开销(若是存在数据库,就多了访问数据库;若是解析成图片再存储,就多了解析的开销)。因此这样方式不可取。vue
二、使用formData对象进行上传。node
先看MDN上对FormData对象的介绍:XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,咱们能够经过JavaScript用一些键值对来模拟一系列表单控件,咱们还可使用XMLHttpRequest的send()方法来异步的提交这个"表单".比起普通的ajax,使用FormData的最大优势就是咱们能够异步上传一个二进制文件 。jquery
构造formDataios
//1 var formData = new FormData(formDOM); //2 var formData = new FormData(); formData.append(name , value , fileName)
在上篇的例子中,建立input的formData对象ajax
var fileInput = document.querySelector('.input-file'); var files = fileInput.files var formData = new FormData(); //建立formData对象 //判断数据 如有 则添加数据 if(files.length > 0){ [].slice.call(files).forEach(function(value,index){ formData.append('img' + index,value,value.name) //遍历添加数据 }) }else { alert('请先选择图片'); return false; }
注意:查看formData对象数据须要用get()或者getAll()方法,直接打印出来是{}的。数据库
弄好了formData对象,再XMLHttpRequest提交到服务端,这里先写一个最简单的上传图片的接口。node小白,请不要吐槽这个粗糙到极致的接口,只是为了测试上传而已。express
formidable = require('formidable'); //载入formidable var express = require('express'); var app = express(); app.use(express.static('src',{ // 静态资源中间件 setHeaders : function(res,path,stat){ res.setHeader('Cache-Control', 'max-age=' + 6000); } })); app.post('/upload',function(req,res){ var form = new formidable.IncomingForm(); form.encoding = 'utf-8'; form.uploadDir = './src/images'; form.keepExtensions = true; form.parse(req,function(err,field,files){ console.log(files); }); res.send({ 'msg':'upload file' }); }); var server = app.listen(8081, function(){ console.log('服务器已启动!'); });
一、原生上传axios
此时的 Content-Type应该为multipart/form-data,原生方式的时候不须要添加也能够,浏览器会自动完成。
浏览器
var httpDemo = new XMLHttpRequest(); //建立httprequest对象 httpDemo.open('post','/upload',true); //初始化请求 post方式 接口 异步 httpDemo.onload = function(e){ console.log(e); } httpDemo.send(formData); //发送请求
查看效果,选择的图片已成功上传到指定的目录。
二、$.ajax()
使用jquery上传有两个配置须要注意:
processData会默认将data转化为字符串,因此须要配置为false,不进行处理。
contentType默认值为application/x-www-form-urlencoded; charset=UTF-8'。上传文件时,Content-Type应该为multipart/form-data。可是设置为multipart/form-data也仍是会失败。只有设置为false才能够。
$.ajax({ url : '/upload', type:'POST', data: formData, processData:false, contentType:false, success:function(data,textStatus,jqXHR){ }, error:function(jqXHR,textStatus,error){ } })
查看效果,依旧能够上传成功。
三、vue-axios上传
只须要配置header便可。
headers: { 'Content-Type': 'multipart/form-data' },