vue 图片上传功能

这次做了vue页面的图片上传功能,不带裁剪功能的!

首先是html代码,在input框上添加change事件,如下:

  1. <ul class="clearfix">

  2. <li v-if="imgs.length>0" v-for='(item ,index ) in imgs'>

  3. <img :src="item">

  4. </li>

  5. <li v-if="imgs.length>=6 ? false : true">

  6. <img src="../../assets/img/addimg.png"><input class="upload" @change='add_img' type="file">

  7. </li>

  8. </ul>

我这里做了图片数量的限制,最多6张。

然后是data数据,如下:

  1. data () {

  2. return {

  3. imgs: [],

  4. imgData: {

  5. accept: 'image/gif, image/jpeg, image/png, image/jpg',

  6. }

  7. }

  8. }

imgs数组是放图片路径的,页面显示图片就是循环这个数组,imgData是判断图片类型的。

接下来是最重要的methods里面的方法,具体如下:

[html]view plaincopy

  1. <code class="language-html">add_img(event){
  2. let reader =new FileReader();
  3. let img1=event.target.files[0];
  4. let type=img1.type;//文件的类型,判断是否是图片
  5. let size=img1.size;//文件的大小,判断图片的大小
  6. if(this.imgData.accept.indexOf(type) == -1){
  7. alert('请选择我们支持的图片格式!');
  8. return false;
  9. }
  10. if(size>3145728){
  11. alert('请选择3M以内的图片!');
  12. return false;
  13. }
  14. var uri = ''
  15. let form = new FormData();
  16. form.append('file',img1,img1.name);
  17. this.$http.post('/file/upload',form,{
  18. headers:{'Content-Type':'multipart/form-data'}
  19. }).then(response => {
  20. console.log(response.data)
  21. uri = response.data.url
  22. reader.readAsDataURL(img1);
  23. var that=this;
  24. reader.onloadend=function(){
  25. that.imgs.push(uri);
  26. }
  27. }).catch(error => {
  28. alert('上传图片出错!');
  29. })
  30. },</code>

首先是获取你选择的图片,判断图片的类型和大小,然后以form表单的形式提交到后台,后台会返回给你这个图片的线上路径,你把后台返回的图片路径push到图片数组里面就可以了。

一般情况下还有删除图片的方法,就是把图片数组里的那个路径删除掉,把数据提交到后台,告诉后台删除了哪张图片就可以了。

<!DOCTYPE html>

<html >

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<meta http-equiv="X-UA-Compatible" content="ie=edge">

<title>Document</title>

<style>

body {

margin: 0;

}

html,

body {

height: 100%;

}

#box {

width: 100%;

height: auto;

}

.img-d {

margin-top: 30px;

width: 300px;

height: 300px;

text-align: center;

position: relative;

}

.img-d span {

display: inline-block;

width: 100%;

height: 100%;

background-image: url("imagess/kmhvbjvb.jpg");

cursor: pointer;

background-size: 100% 100%;

background-repeat: no-repeat;

}

#up {

/* display: none; */

}

.rems {

display: inline-block;

width: 25px;

height: 25px;

background: red;

border-radius: 50% 50%;

font-size: 17px;

position: absolute;

top: -6px;

right: -6px;

color: white;

text-align: center;

line-height: 25px;

cursor: pointer;

}

</style>

</head>

<body>

<div >

</div>

</div>

<script>

// span的点击事件

var addBtn = document.querySelector('.up-s');

addBtn.addEventListener('click', function () {

document.querySelector('#up').value = null;

document.querySelector('#up').click();

return false;

}, false);

// 处理input点击之后的change事件

document.getElementById("up").addEventListener("change", function (e) {

var files = this.files;

var reader = new FileReader();

reader.readAsDataURL(files[0]);

reader.onload = function (e) {

var dx = (e.total / 1024) / 1024;

if (dx >= 2) {

alert("文件大小大于2M");

return;

}

var result = this.result;//这里就是转化之后的DataURL

addBtn.style.backgroundImage = "url(" + result + ")";

}

var rem = document.createElement("i");

rem.setAttribute("class", "rems");

rem.innerHTML = "x";

document.querySelector(".img-d").appendChild(rem);

rem.addEventListener('click', function () {

this.style.display = "none";

addBtn.style.backgroundImage = "url(imagess/kmhvbjvb.jpg)";

});

})

</script>

</body>

</html>