//先介紹一下背景
//首先頭頂上有一個(gè)保存按鈕,用來(lái)上傳圖片的
//下面是內(nèi)容 , 有一個(gè)input框,type=file.. 有一個(gè)button, 用來(lái)代替input去選擇文件
//我的后臺(tái)是要從請(qǐng)求的api里拿到上傳的url地址,再通過(guò)頭頂?shù)谋4姘粹o上傳,之后返回一個(gè)圖片的url地址,動(dòng)態(tài)綁定到頁(yè)面的img標(biāo)簽上顯示出來(lái)
//參考了網(wǎng)上一些寫法, 我這里只為了實(shí)現(xiàn)功能, 不做其它處理
//樣式就不寫了, 最后貼張圖
<template>
<div @click="onUpload">保存</div> //頂部上傳按鈕
<button @click="onPickFile">選擇圖片</button> //把下面input隱藏,代替它選擇文件
<input
type="file"
ref="fileInput"
accept="image/*"
@change="getFile"
style="display: none"
> //選擇文件
<img :src="imageUrl"/> //綁定文件地址
</template>
<script>
import axios from 'axios' //獲取上傳的鏈接
export default {
name: 'whatever',
data () {
return {
imageUrl: "", //img綁定的src地址
postUrl: "" //需要上傳到的地址
}
},
mounted () {
//第一步:先請(qǐng)求一下api,看看需要上傳到哪里去,存到postUrl里面 ( 做了跨域配置,所以直接寫成了api )
axios.get('api/getUploadInfo?type=image').then( res => {
if ( res.status === 200 && res.data){
let data = res.data.data
let postUrl = data.url
console.log( postUrl) //頁(yè)面掛載后,先打印一下,拿到了需要上傳到的url地址 ( 第一次有效打印 )
this.postUrl = postUrl //把地址保存下來(lái)
}
})
},
methods : {
//第二步:再來(lái)寫個(gè)方法, button代替input選擇圖片
onPickFile () {
this.$refs.fileInput.click()
},
//第三步: 文件選擇后, 后在頁(yè)面上顯示出來(lái) 轉(zhuǎn)base64位的操作
getFile (event) {
const files = event.target.files
let filename = files[0].name //只有一個(gè)文件
if ( filename.lastIndexOf('.') <= 0 ) {
return alert("Please add a valid image!") //判斷圖片是否有效
}
const fileReader = new FileReader() //內(nèi)置方法new FileReader() 讀取文件
fileReader.addEventListener('load',() => {
this.imageUrl = fileReader.result
})
fileReader.readAsDataURL(files[0])
this.image = files[0]
//到這里后, 選擇圖片就可以顯示出來(lái)了
} ,
//第四步: 上傳文件了
onUpload (event) {
event.preventDefault();
let fd = new FormData() //內(nèi)置方法new FormData() 新建一個(gè)表格
fd.append('file',this.image) //把image添加進(jìn)去
console.log(this.image) //( 第二次有效打印 )
axios.post(this.postUrl,fd).then( res => { //第一個(gè)參:this.postUrl就是上面保存好的要上傳的地址
console.log(res) //( 第三次有效打印 )
if(res.status === 200 && res.data ){
let data = res.data.data
let imageUrl = data.url //上傳成功 , 后臺(tái)返回了一個(gè)圖片地址
this.imageUrl = imageUrl
}
}).catch(error => {
console.log(error)
})
}
}
}
</script>
第一次打印結(jié)果
選擇圖片后
第二次和第三次打印結(jié)果 ( 選擇圖片并點(diǎn)擊保存上傳按鈕后)