van-uploader保存文件到后端回顯后端接口返回的數(shù)據(jù)
實(shí)現(xiàn)功能:
在移動端使用van-uploader組件上傳圖片,然后調(diào)用接口保存到后端數(shù)據(jù)庫,提交保存信息成功后,調(diào)用另外的接口返回?cái)?shù)據(jù)用來回顯uploaded的文件,(一般正常的返回?cái)?shù)據(jù)的接口是個(gè)圖片地址,可以直接顯示),我現(xiàn)在遇到的功能是返回了一個(gè)圖片地址,然后我需要在前端頁面自己去調(diào)一次圖片地址的接口。

<div class="imgWrap">
<!-- :max-count="3" -->
<van-uploader
:disabled="isUpload"
:before-read="beforeUpHandle"
:after-read="onRead"
@click="emitCont"
v-model="fileList"
multiple
:max-count="15"
@delete="handleRemove"
>
<van-button
icon="photograph
"
></van-button>
<div class="addImg">添加圖片</div>
</van-uploader>
</div>對van-uploader組件不熟悉的可以去官網(wǎng)自行查看

保存信息的接口代碼:
這里要在文件讀取完成后的回調(diào)函數(shù)中使用
async function onRead(file: any, detail: any) {
? ? ? ? ? ? let formData = new FormData() //格式化必不可少,在里面添加接口需要傳的參數(shù)
? ? ? ? ? ? formData.append('file', file.file)
? ? ? ? ? ? formData.append('sort', detail.index)
? ? ? ? ? ? getUploadKey(formData).then(res => {
? ? ? ? ? ? ? ? if (res.resultCode === '00') {
? ? ? ? ? ? ? ? ? ? let result = res.data
? ? ? ? ? ? ? ? }
? ? ? ? ? ? })
? ? ? ? }接下來是回顯接口返回的數(shù)據(jù)在uploader,這里主要遇到的是v-model的fileList綁定的值,把接口獲取的值直接賦值給fileList即可以。
1、獲取接口的值,我這邊假設(shè)為fetchData,我做了一個(gè)判斷,fetchData有值才調(diào)用圖片地址的數(shù)據(jù)
if (fetchData.value.length > 0) {
? ? ? ? ? ? ? ? //當(dāng)回顯的圖片有多張時(shí)需要做一個(gè)循環(huán)
? ? ? ? ? ? ? ? for (let i = 0; i < fetchData.value.length; i++) {
? ? ? ? ? ? ? ? ? ? let item =fetchData.value[i];
? ? ? ? ? ? ? ? ? ? item = {
? ? ? ? ? ? ? ? ? ? ? ? url: item.imgUrl, //這里的imgUrl后端接口返回的圖片地址
? ? ? ? ? ? ? ? ? ? ? ? sort: item.sort,? ?//這里的數(shù)據(jù)按照自己的實(shí)際情況添加,我是后面需要到sort才添加的,不然有url即可顯示
? ? ? ? ? ? ? ? ? ? }),
? ? ? ? ? ? ? ? ? ? ? ? console.log(item.url, 'uuuu')
? ? ? ? ? ? ? ? ? ? ?//開始調(diào)用圖片地址接口,因?yàn)槲疫@里圖片接口返回的二進(jìn)制流圖片數(shù)據(jù)格式,前端需要處理才能顯示。如下使用的是:
1、先設(shè)置axios接收參數(shù)格式為"arraybuffer"
2、轉(zhuǎn)換為base64格式圖片數(shù)據(jù)在img標(biāo)簽顯示
3、return 'data:image/png;base64,' + btoa( new Uint8Array(res.data).reduce((data, byte) => data + String.fromCharCode(byte), '') );
? ? ? ? ? ? ? ? ? ? axios({
? ? ? ? ? ? ? ? ? ? ? ? method: 'get',
? ? ? ? ? ? ? ? ? ? ? ? url: item.url,
? ? ? ? ? ? ? ? ? ? ? ? headers: {
? ? ? ? ? ? ? ? ? ? ? ? ? ? 'XXX-XXX-TOKEN': XXXXXX,//需要到token的小伙伴借鑒
? ? ? ? ? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? ? ? ? ? responseType: 'arraybuffer',
? ? ? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? ? ? ? ? .then(res => {
? ? ? ? ? ? ? ? ? ? ? ? //若是沒有做這個(gè)obj的封裝,圖片將無法顯示。
? ? ? ? ? ? ? ? ? ? ? ? ? ? let obj = {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? content: `data:image/png;base64,${btoa(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? new Uint8Array(res.data).reduce(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (data, byte) => data + String.fromCharCode(byte),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '',
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )}`,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sort: item.sort,
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? fileList.value.push(obj)
? ? ? ? ? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? ? ? ? ? .catch(err => {
? ? ? ? ? ? ? ? ? ? ? ? ? ? reject(err.data)
? ? ? ? ? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }補(bǔ)充:van-uploader這個(gè)組件要回顯圖片兩種方法:
1、提供圖片的base64字符串
直接把base64字符串加前綴之后,封裝成一個(gè)obj放入fileList,就可以直接回顯圖片
2、提供文件的二進(jìn)制流
(這種能回顯圖片因?yàn)楹蠖四芙邮苓@樣的請求方式。但現(xiàn)在很多框架不支持沒有完整請求頭的請求,那么就會請求不到后端圖片回顯失敗,這種方式還是有一定局限性的),我一開始用的這個(gè)方法就是沒有實(shí)現(xiàn)回顯所以又考慮轉(zhuǎn)為base64格式來顯示。
總結(jié)
到此這篇關(guān)于van-uploader保存文件到后端回顯后端接口返回的數(shù)據(jù)的文章就介紹到這了,更多相關(guān)van-uploader保存文件到后端內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue3項(xiàng)目中eslint+prettier統(tǒng)一代碼風(fēng)格方式
這篇文章主要介紹了vue3項(xiàng)目中eslint+prettier統(tǒng)一代碼風(fēng)格方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05
vue使用axios實(shí)現(xiàn)動態(tài)追加數(shù)據(jù)
在vuejs中使用axios時(shí),有時(shí)候需要追加數(shù)據(jù),比如,移動端下拉觸底加載,分頁加載,滑動滾動條等,下面小編就來為大家介紹一下如何使用使用axios實(shí)現(xiàn)動態(tài)追加數(shù)據(jù)吧2023-10-10
vue 的keep-alive緩存功能的實(shí)現(xiàn)
本篇文章主要介紹了vue 的keep-alive緩存功能的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
vue3語法中使用vscode打開滿屏紅線報(bào)錯(cuò)的完美解決方法
這篇文章主要介紹了vue3語法中使用vscode打開滿屏紅線報(bào)錯(cuò)的完美解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
vue短信驗(yàn)證性能優(yōu)化如何寫入localstorage中
這篇文章主要介紹了vue短信驗(yàn)證性能優(yōu)化寫入localstorage中的方法,解決這個(gè)問題需要把時(shí)間都寫到localstorage里面去,具體解決方法大家參考下本文2018-04-04

