首先说一下会用到几个知识点
1.
event.target.files[0]
获取的是上传的图片的一些参数如下图:

可以自己依次打印看看
console.log(event, event.target, event.target.files, event.target.files[0])
2.
HTML5中FileReader
在FileReader出现之前,前端的图片预览是这样实现的:
把本地图片上传到服务器,服务器把图片地址返回,并把它替换到图片元素的src属性。
这种方法的缺点是:
必须要先把图片上传到服务器。如果上传的图片很大,而网速又很慢,这就需要等待很久预览图片才会显示出来了,如果用户预览图片后发现不太满意,想重新选择一张图片,这时候还要把已经上传到服务器上的图片给删除掉。
有了HTML5的FileReader对象以后,预览图片变得简单多了,不再需要后台的配合,这种方法的思路是:
通过FileReader.prototype.readAsDataURL()
方法把图片文件转成base64编码,然后把base64编码替换到预览图片的src属性即可。
let that = this;
let file = event.target.files[0];
let reader = new FileReader();
// 调用reader.readAsDataURL()方法,把图片转成base64
reader.readAsDataURL(file);
// 监听reader对象的onload事件,当图片加载完成时,把base64编码賦值给预览图片
reader.onload = function () {
file.src = this.result;
// console.log(this); 这里的this是FileReader对象
// console.log(file)
// 再把file对象添加到img数组
that.imgList.push({
file
});
}
完整FileReader api
https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader
3.
HTML5中FormData
FormData可以把它理解成一个虚拟的表单对象,它只有一个方法append,可以在浏览器console一下就知道了。我们可以通过append向FormData里面添加各种需要提交的数据。
先创建一个空的FormData对象,然后使用append()方法向该对象里添加字段,如下:
var oMyForm = new FormData();
oMyForm.append("username", "Groucho");
oMyForm.append("accountnum", 123456); // 数字123456被立即转换成字符串"123456"
如果已经有一个Form表单,只需要把这个form dom元素作为参数传入FormData构造函数即可:
var form=document.getElementById("form1");
var formData=new FormData(form);
var oReq = new XMLHttpRequest();
oReq.onreadystatechange=function(){
if(oReq.readyState === 4){
if(oReq.status === 200){
var json=JSON.parse(oReq.responseText);
var result = '';
}
}
}
oReq.open("POST", "server.php");
oReq.send(formData);
在vue中使用:
data () {
return {
imgList: [],
size: 0,
imgData: {
accept: 'image/gif, image/jpeg, image/png, image/jpg',
},
img: require('./5.jpg'),
// 选中的省、市、区
city: [],
// 3级联动城市数据来源area-data
pcaa: pcaa,
show: true
}
},
methods: {
// dom触发
fileClick() {
this.$refs.uploadfile.click()
},
// 上传图片
fileChange (event) {
// console.log(event, event.target, event.target.files, event.target.files[0])
if (!event.target.files[0].size) return;
let files = event.target.files;
// 批量上传
for (let i = 0; i < files.length; i++) {
// 单张上传
this.fileAdd(files[i]);
}
// console.log(this.imgList)
},
// 单张上传
fileAdd (file) {
// console.log(file);
let type=file.type;//文件的类型,判断是否是图片
let size=file.size;//文件的大小,判断图片的大小
if(this.imgData.accept.indexOf(type) === -1){
alert('请选择我们支持的图片格式!');
return false;
}
if(size > 3145728){
alert('请选择3M以内的图片!');
return false;
}
let that = this;
// 总大小
this.size = this.size + file.size;
let reader = new FileReader();
// 调用reader.readAsDataURL()方法,把图片转成base64
reader.readAsDataURL(file);
// 监听reader对象的onload事件,当图片加载完成时,把base64编码賦值给预览图片
reader.onload = function () {
file.src = this.result;
// console.log(this); 这里的this是FileReader对象
// 再把file对象添加到imgList数组
that.imgList.push({
file
});
}
},
// 计算转换图片大小
bytesToSize (bytes) {
if (bytes === 0) return '0 B';
let k = 1000, // or 1024
sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
i = Math.floor(Math.log(bytes) / Math.log(k));
return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];
},
// 删除
fileDel (index) {
this.size = this.size - this.imgList[index].file.size;//总大小
this.imgList.splice(index, 1);
this.img = require('./5.jpg');
},
// 更换预览图片
changeImg (index) {
// console.log(this.imgList[index].file.src)
this.img = this.imgList[index].file.src;
}
},
computed: {
},
watch: {
// 监听imgList数据变化,不能超过9张图片
imgList: function () {
if (this.imgList.length > 9) {
this.imgList.length = 9;
// 超过9张后重新计算图片大小
this.size = 0;
for (let i = 0; i < 9; i ++) {
this.size = this.size + this.imgList[i].file.size;
}
// console.log(this.imgList);
}
}
},
参考文献:
https://blog.csdn.net/leileibrother/article/details/79020758
https://www.cnblogs.com/lwwen/p/6210126.html
https://blog.csdn.net/weixin_41957098/article/details/80351914
来源:https://www.cnblogs.com/gr07/p/9628523.html