Vue項(xiàng)目如何根據(jù)圖片url獲取file對(duì)象并用axios上傳
vue根據(jù)圖片url獲取file對(duì)象并用axios上傳
圖片url轉(zhuǎn)file對(duì)象
<script>
export default {
data() {
return {
ruleForm: {
coverUrl: "",
coverFile: ""
},
};
},
methods: {
imgUrlToFile(url) {
var self = this;
var imgLink = url;
var tempImage = new Image();
//如果圖片url是網(wǎng)絡(luò)url,要加下一句代碼
tempImage.crossOrigin = "*";
tempImage.onload = function() {
var base64 = self.getBase64Image(tempImage);
var imgblob = self.base64toBlob(base64);
var filename = self.getFileName(self.ruleForm.coverUrl);
self.ruleForm.coverFile = self.blobToFile(imgblob, filename);
};
tempImage.src = imgLink;
},
getBase64Image(img) {
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0, img.width, img.height);
var ext = img.src.substring(img.src.lastIndexOf(".") + 1).toLowerCase();
var dataURL = canvas.toDataURL("image/" + ext);
return dataURL;
},
base64toBlob(base64) {
let arr = base64.split(","),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });
},
blobToFile(blob, filename) {
// edge瀏覽器不支持new File對(duì)象,所以用以下方法兼容
blob.lastModifiedDate = new Date();
blob.name = filename;
return blob;
},
getFileName(url) {
// 獲取到文件名
let pos = url.lastIndexOf("/"); // 查找最后一個(gè)/的位置
return url.substring(pos + 1); // 截取最后一個(gè)/位置到字符長(zhǎng)度,也就是截取文件名
}
}
};
</script>axios上傳
注意:
用以上方法得到file的對(duì)象在上傳時(shí),還必須在表單的append方法中增加文件名,否則后端收到的只是blob對(duì)象,而不是文件,如下:
submitForm() {
? ? //...
?? ?var filename = this.getFileName(this.ruleForm.coverUrl);
?? ?params.append(
?? ? ?"course_cover",
?? ? ?this.ruleForm.coverFile,
?? ? ?filename
?? ?);
?? ?//....
}vue項(xiàng)目中使用axios上傳圖片等文件
首先安裝axios
1.利用npm安裝npm install axios –save
2.利用bower安裝bower install axios –save
3.直接利用cdn引入
一般情況上傳照片有兩種方式
1.本地圖片轉(zhuǎn)換成base64,然后通過普通的post請(qǐng)求發(fā)送到服務(wù)端。操作簡(jiǎn)單,適合小圖,以及如果想兼容低版本的ie沒辦法用此方法
2.通過form表單提交。form表單提交圖片會(huì)刷新頁面,也可以時(shí)form綁定到一個(gè)隱藏的iframe上,可以實(shí)現(xiàn)無刷新提交數(shù)據(jù)。
這里只講解一下第二種方式
html代碼:
<input name="file" type="file" accept="image/png,image/gif,image/jpeg" @change="update"/>
js代碼:
import axios from 'axios'
// 添加請(qǐng)求頭
update (e) { // 上傳照片
var self = this
let file = e.target.files[0]
/* eslint-disable no-undef */
let param = new FormData() // 創(chuàng)建form對(duì)象
param.append('file', file) // 通過append向form對(duì)象添加數(shù)據(jù)
param.append('chunk', '0') // 添加form表單中其他數(shù)據(jù)
console.log(param.get('file')) // FormData私有類對(duì)象,訪問不到,可以通過get判斷值是否傳進(jìn)去
let config = {
headers: {'Content-Type': 'multipart/form-data'}
}
// 添加請(qǐng)求頭
axios.post('http://172.19.26.60:8081/rest/user/headurl', param, config)
.then(response => {
if (response.data.code === 0) {
self.ImgUrl = response.data.data
}
console.log(response.data)
})
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue實(shí)現(xiàn)點(diǎn)擊按鈕“查看詳情”彈窗展示詳情列表操作
這篇文章主要介紹了vue實(shí)現(xiàn)點(diǎn)擊按鈕“查看詳情”彈窗展示詳情列表操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Vue.js 單頁面多路由區(qū)域操作的實(shí)例詳解
這篇文章主要介紹了 Vue.js 單頁面多路由區(qū)域操作的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07
Vue.js移動(dòng)端左滑刪除組件的實(shí)現(xiàn)代碼
本篇文章主要介紹了Vue.js移動(dòng)端左滑刪除組件的實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
Vue3+Element?Plus按需引入(自動(dòng)導(dǎo)入)詳解
element-plus根據(jù)官網(wǎng)文檔,推薦用戶采用按需導(dǎo)入的方式進(jìn)行導(dǎo)入,下面這篇文章主要給大家介紹了關(guān)于Vue3+Element?Plus按需引入(自動(dòng)導(dǎo)入)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10
Vue實(shí)現(xiàn)計(jì)算器計(jì)算效果
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)計(jì)算器計(jì)算效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
詳解vue中父子組件傳遞參數(shù)props的實(shí)現(xiàn)方式
這篇文章主要給大家介紹了在vue中,父子組件傳遞參數(shù)?props?實(shí)現(xiàn)方式,文章通過代碼示例介紹的非常詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的參考價(jià)值,需要的朋友可以參考下2023-07-07
Vue 實(shí)現(xiàn)從小到大的橫向滑動(dòng)效果詳解
這篇文章主要介紹了Vue 實(shí)現(xiàn)從小到大的橫向滑動(dòng)效果,結(jié)合實(shí)例形式詳細(xì)分析了vue.js橫向漸變滑動(dòng)效果的實(shí)現(xiàn)步驟、相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-10-10

