vue 如何原生組件如何實現圖片上傳?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
1 一個頁面上傳一張圖片
當一個頁面只有一個位置需要上傳圖片,很簡單,直接綁定上傳按鈕
html頁面
<div class="col-md-4"> <input class="hidden" accept="image/png,image/jpg" type="file" id="tempUploadFile" v-on:change="uploadPic($event)" /> <input class="hidden" v-model="mapItem.MapIcon" /> <img class="imgbgbox" v-bind:src="mapItem.MapIcon" /> </div>
js代碼:封裝上傳圖片的方法
uploadPic(e) {
var _self = this;
var inputFile = e.target;
if (!inputFile.files || inputFile.files.length <= 0) {
return;
}
var file = inputFile.files[0];
var formData = new FormData();
formData.append('file', file);
formData.append('SaveDir', 'Map/MapItem');
formData.append("FileName", $.whiskey.tools.dateFormat(new Date(), "HHmmssffff"));
$.ajax({
url: "/Upload/UploadPic",//后臺上傳圖片的方法
type: 'POST',
dateType: 'json',
cache: false,
data: formData,
processData: false,
contentType: false,
success: function (res) {
if (res.ResultType == 3) {
var filePath = res.Data.file;//后臺返回的圖片路徑
_self.mapItem.MapIcon = filePath;//將路徑賦值到聲明的變量中
}
}
});
},2 一個頁面上傳多張圖片
當一個頁面有多個位置需要上傳圖片,如果按照上面方法,得需要綁定多個上傳函數,所以我把重復的部分封裝出來,用到了promise函數
html頁面
<div class="col-md-4"> <input class="hidden" accept="image/png,image/jpg" type="file" id="tempUploadFile" v-on:change="uploadPic($event)" /> <input class="hidden" v-model="mapItem.MapIcon" /> <img class="imgbgbox" v-bind:src="mapItem.MapIcon" /> </div>
js代碼:封裝上傳圖片的方法
uploadPic(e) {
var _self = this;
var inputfile = e.target;
_self.uploadImg(inputfile).then(data => {
_self.mapItem.MapIcon = data;//data為取到的圖片路徑
})
},
//封裝函數
uploadImg(inputFile) {
var _self = this;
if (!inputFile.files || inputFile.files.length <= 0) {
return;
}
return new Promise((suc,err)=>{
var file = inputFile.files[0];
var filepath = "";
var formData = new FormData();
formData.append('file', file);
formData.append('SaveDir', 'Map/MapSite');
formData.append("FileName", $.whiskey.tools.dateFormat(new Date(), "HHmmssffff"));
$.ajax({
url: "/Upload/UploadPic",
type: 'POST',
dateType: 'json',
cache: false,
data: formData,
processData: false,
async:false,
contentType: false,
success: function (res) {
if (res.ResultType == 3) {
filepath = res.Data.file;
suc(filepath);
}
}
});
})
},
},補充知識:vue 利用原生input上傳圖片并預覽并刪除
看代碼~
<template> <div class="com-upload-img"> <div class="img_group"> <div v-if="allowAddImg" class="img_box"> <input type="file" accept="image/*" multiple="multiple" @change="changeImg($event)"> <div class="filter" /> </div> <div v-for="(item,index) in imgArr" :key="index" class="img_box"> <div class="img_show_box"> <img :src="item" alt=""> <i class="img_delete" @click="deleteImg(index)" /> <!-- <i class="img_delete" @click="imgArr.splice(index,1)"></i> --> </div> </div> </div> </div> </template>
js部分
<script>
export default {
name: 'ComUpLoad',
data() {
return {
imgData: '',
imgArr: [],
imgSrc: '',
allowAddImg: true
}
},
methods: {
changeImg: function(e) {
var _this = this
var imgLimit = 1024
var files = e.target.files
var image = new Image()
if (files.length > 0) {
var dd = 0
var timer = setInterval(function() {
if (files.item(dd).type !== 'image/png' && files.item(dd).type !== 'image/jpeg' && files.item(dd).type !== 'image/gif') {
return false
}
if (files.item(dd).size > imgLimit * 102400) {
// to do sth
} else {
image.src = window.URL.createObjectURL(files.item(dd))
image.onload = function() {
// 默認按比例壓縮
var w = image.width
var h = image.height
var scale = w / h
w = 200
h = w / scale
// 默認圖片質量為0.7,quality值越小,所繪制出的圖像越模糊
var quality = 0.7
// 生成canvas
var canvas = document.createElement('canvas')
var ctx = canvas.getContext('2d')
// 創建屬性節點
var anw = document.createAttribute('width')
anw.nodeValue = w
var anh = document.createAttribute('height')
anh.nodeValue = h
canvas.setAttributeNode(anw)
canvas.setAttributeNode(anh)
ctx.drawImage(image, 0, 0, w, h)
var ext = image.src.substring(image.src.lastIndexOf('.') + 1).toLowerCase()// 圖片格式
var base64 = canvas.toDataURL('image/' + ext, quality)
// 回調函數返回base64的值
if (_this.imgArr.length <= 4) {
_this.imgArr.unshift('')
_this.imgArr.splice(0, 1, base64)// 替換數組數據的方法,此處不能使用:this.imgArr[index] = url;
if (_this.imgArr.length >= 5) {
_this.allowAddImg = false
}
}
}
}
if (dd < files.length - 1) {
dd++
} else {
clearInterval(timer)
}
}, 1000)
}
},
deleteImg: function(index) {
this.imgArr.splice(index, 1)
if (this.imgArr.length < 5) {
this.allowAddImg = true
}
}
}
}
</script>關于vue 如何原生組件如何實現圖片上傳問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。