以前寫過一篇關於Golang後端如何對圖片進行base64解碼並保存至文件服務器的文章傳送門,如今補充前端vue框架下如何對圖片壓縮上傳(使用了vant的上傳組件)。前端
減輕服務端壓力,減小流量。vue
<van-cell-group>
<van-cell title="上傳圖片">
<van-uploader :after-read="uploadImg"
accept="image/gif, image/jpeg ,image/png"
:max-size=6000000
@oversize="overSize" >
<van-icon name="photograph"/>
</van-uploader>
</van-cell>
</van-cell-group>
<div class="show-img">
<div class="item" v-for="(item, index) in imgBase64" :key="index">
<span class="cancel-btn" @click="delImg(index)">x</span>
<img :src="item">
</div>
</div>
//script中定義imgBase64圖片數組,存放base64編碼的圖片
data() {
return {
imgBase64: [],
}
},
複製代碼
uploadImg(file) {
// 大於1.5MB的jpeg和png圖片都縮小像素上傳
if(/\/(?:jpeg|png)/i.test(file.file.type)&&file.file.size>1500000) {
// 建立Canvas對象(畫布)
let canvas = document.createElement('canvas')
// 獲取對應的CanvasRenderingContext2D對象(畫筆)
let context = canvas.getContext('2d')
// 建立新的圖片對象
let img = new Image()
// 指定圖片的DataURL(圖片的base64編碼數據)
img.src = file.content
// 監聽瀏覽器加載圖片完成,而後進行繪製
img.onload = () => {
// 指定canvas畫布大小,該大小爲最後生成圖片的大小
canvas.width = 400
canvas.height = 300
/* drawImage畫布繪製的方法。(0,0)表示以Canvas畫布左上角爲起點,400,300是將圖片按給定的像素進行縮小。*/
/* 若是不指定縮小的像素,圖片將以圖片原始大小進行繪製,圖片像素若是大於畫布將會從左上角開始按畫布大小部分繪製圖片,最後獲得的圖片就是張局部圖。圖片小於畫布就會有黑邊。*/
context.drawImage(img, 0, 0, 400, 300)
// 將繪製完成的圖片從新轉化爲base64編碼,file.file.type爲圖片類型,0.92爲默認壓縮質量
file.content = canvas.toDataURL(file.file.type, 0.92)
// 最後將base64編碼的圖片保存到數組中,留待上傳。
if(this.imgBase64.length < 6) {
this.imgBase64.push(file.content)
}else{
alert("最多上傳6張圖片")
}
}
}else{
// 不作處理的jpg和png以及gif直接保存到數組
if(this.imgBase64.length < 6) {
this.imgBase64.push(file.content)
}else{
alert("最多上傳6張圖片")
}
}
},
複製代碼
當咱們用vant的上傳圖片組件選中一張圖片時,就會觸發該方法,形參file中包含了content和file對象,content是組件爲咱們自動處理的base64編碼圖片,直接就能在網頁中顯示。圖片處理代碼中有詳細的註釋。ios
//post請求
post(url, data) {
let storage = window.localStorage
return new Promise((resolve) => {
axios({
method: 'post',
url: url,
data: JSON.stringify(data),//將post請求的數據轉化爲json對象
headers: { 'Authorization': storage.token,'Content-Type': 'application/json; charset=UTF-8'},
cancelToken: new CancelToken(c => {
cancel = c
})
}).then(res => {
resolve(res)
})
})
},
axios.post(
'/v2/publish',
{
imgList: this.imgBase64
}
)
.then( response => {
)
複製代碼
本文沒有過多的講解,只是提供一個處理的思路,另外圖片的壓縮我也只是簡單縮小到400寬300高,具體的寬高根據比例來更好。也沒有用到所謂的壓縮,本質就是將大圖縮小而後上傳。json