Vue項目如何根據(jù)圖片url獲取file對象并用axios上傳
vue根據(jù)圖片url獲取file對象并用axios上傳
圖片url轉(zhuǎn)file對象
<script> export default { data() { return { ruleForm: { coverUrl: "", coverFile: "" }, }; }, methods: { imgUrlToFile(url) { var self = this; var imgLink = url; var tempImage = new Image(); //如果圖片url是網(wǎng)絡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對象,所以用以下方法兼容 blob.lastModifiedDate = new Date(); blob.name = filename; return blob; }, getFileName(url) { // 獲取到文件名 let pos = url.lastIndexOf("/"); // 查找最后一個/的位置 return url.substring(pos + 1); // 截取最后一個/位置到字符長度,也就是截取文件名 } } }; </script>
axios上傳
注意:
用以上方法得到file的對象在上傳時,還必須在表單的append方法中增加文件名,否則后端收到的只是blob對象,而不是文件,如下:
submitForm() { ? ? //... ?? ?var filename = this.getFileName(this.ruleForm.coverUrl); ?? ?params.append( ?? ? ?"course_cover", ?? ? ?this.ruleForm.coverFile, ?? ? ?filename ?? ?); ?? ?//.... }
vue項目中使用axios上傳圖片等文件
首先安裝axios
1.利用npm安裝npm install axios –save
2.利用bower安裝bower install axios –save
3.直接利用cdn引入
一般情況上傳照片有兩種方式
1.本地圖片轉(zhuǎn)換成base64,然后通過普通的post請求發(fā)送到服務端。操作簡單,適合小圖,以及如果想兼容低版本的ie沒辦法用此方法
2.通過form表單提交。form表單提交圖片會刷新頁面,也可以時form綁定到一個隱藏的iframe上,可以實現(xiàn)無刷新提交數(shù)據(jù)。
這里只講解一下第二種方式
html代碼:
<input name="file" type="file" accept="image/png,image/gif,image/jpeg" @change="update"/>
js代碼:
import axios from 'axios' // 添加請求頭 update (e) { // 上傳照片 var self = this let file = e.target.files[0] /* eslint-disable no-undef */ let param = new FormData() // 創(chuàng)建form對象 param.append('file', file) // 通過append向form對象添加數(shù)據(jù) param.append('chunk', '0') // 添加form表單中其他數(shù)據(jù) console.log(param.get('file')) // FormData私有類對象,訪問不到,可以通過get判斷值是否傳進去 let config = { headers: {'Content-Type': 'multipart/form-data'} } // 添加請求頭 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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue實現(xiàn)點擊按鈕“查看詳情”彈窗展示詳情列表操作
這篇文章主要介紹了vue實現(xiàn)點擊按鈕“查看詳情”彈窗展示詳情列表操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09詳解vue中父子組件傳遞參數(shù)props的實現(xiàn)方式
這篇文章主要給大家介紹了在vue中,父子組件傳遞參數(shù)?props?實現(xiàn)方式,文章通過代碼示例介紹的非常詳細,對我們的學習或工作有一定的參考價值,需要的朋友可以參考下2023-07-07