個人博客里部分內容用到了圖片上傳
那就需要用到vue-element-admin中的upload組件
首先我們需要在需要到圖片上傳的vue文件里引入upload組件 並使用標簽的形式使用該組件 通過v-model綁定image屬性
<template> <div class="createPost-container"> <Upload v-model="image"/> </div> </template> <script> import Upload from '@/components/Upload/SingleImage3' export default { name: 'EssayDetail', components: {Upload}, data() { image:'' }, } </script>
這樣組件就能夠為我們做上傳圖片的功能
這樣的圖片上傳使用的是upload默認的上傳,而它內部做的事情則是將我們上傳的文件轉為image base64編碼
返回的結果可能是
data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD//gAQTGF2YzU4LjI3LjEwMAD/2wBDAAgCAgICAgICAgICAgMDAwMDAwMDAwMDAwMDAwMEBAQDAwMDAwMDBAQEBAQEBAQEBAQEBAUFBQYGBQUHBwcICAr/xAD9AAEAAgMBAQEAAAAAAAAAAAAAAgEGBAMFBwgBAQEBAQEBAQEAAAAAAAAAAAABAgMEBQYHEAABAwMCAwUEBQYJBAoIDBcBAAIDBAUREgYhBzFBYVEIEyKBFHEyFaGR8DMjwUKxUlNykuHRYgkkFoIXVPElQ6JVpLLSNNQYtHRWczU34pVElNODY+Q2ZrV1J9W25cTFw8KT..........................(后面省略1萬個字符)
或者更長的Base64編碼
然后再將這么長的一條編碼存入到數據庫,很顯然這么長的編碼已經超出了預算 雖然數據庫字段啊可以用varchar、text、longtext這樣的類型但早已跟我們預期的不符,如果將這么長的編碼存入到數據庫很顯然影響查詢效率
那唯一的方式就是通過upload這個組件的源碼進行修改
以上面引入的Upload/SingleImage3為例 打開SingleImage3.vue文件
<template> <div class="upload-container"> <el-upload :data="dataObj" :multiple="false" :show-file-list="false" :on-success="handleImageSuccess" class="image-uploader" drag action="https://httpbin.org/post" > <i class="el-icon-upload" /> <div class="el-upload__text"> 將文件拖到此處,或<em>點擊上傳</em> </div> </el-upload> <div class="image-preview image-app-preview"> <div v-show="imageUrl.length>1" class="image-preview-wrapper"> <img :src="imageUrl"> <div class="image-preview-action"> <i class="el-icon-delete" @click="rmImage" /> </div> </div> </div> <div class="image-preview"> <div v-show="imageUrl.length>1" class="image-preview-wrapper"> <img :src="imageUrl"> <div class="image-preview-action"> <i class="el-icon-delete" @click="rmImage" /> </div> </div> </div> </div> </template> 通過element-ui的官方文檔閱讀可知action="https://httpbin.org/post" 這個屬性,這是圖片的上傳地址,並綁定了文件上傳成功時的鈎子 :on-success="handleImageSuccess" 接着查看handleImageSuccess這個方法 export default { name: 'SingleImageUpload3', props: { value: { type: String, default: '' } }, data() { return { tempUrl: '', dataObj: { token: '', key: '' } } }, computed: { imageUrl() { return this.value } }, methods: { rmImage() { this.emitInput('') }, emitInput(val) { this.$emit('input', val) }, handleImageSuccess(file) { this.emitInput(file.files.file) }, beforeUpload() { const _self = this return new Promise((resolve, reject) => { getToken().then(response => { const key = response.data.qiniu_key const token = response.data.qiniu_token _self._data.dataObj.token = token _self._data.dataObj.key = key this.tempUrl = response.data.qiniu_url resolve(true) }).catch(err => { console.log(err) reject(false) }) }) } } }
而關於on-success在elementUI官網中的解釋是
參數 | 說明 | 類型 | 可選值 | 默認值 |
---|---|---|---|---|
on-success | 文件上傳成功時的鈎子 | function(response, file, fileList) | — | — |
on-success綁定的handleImageSuccess函數中只有file 這個參數 ,顯然這個函數可以再多加一個response參數
response是上傳成功的回調,我們可以通過后端實現一個圖片上傳接口把action屬性該為我們自己實現的圖片上傳接口,返回一條json
我后端定義的接口是 /pic/upload 后台返回的數據是json數據格式為,(根據自己情況定義json結構)
{ "success":true, "code":200, "message":"上傳成功", "data":"(上傳成功的圖片地址)" }
並將handleImageSuccess改為
handleImageSuccess(res, file) { this.emitInput(res.data) }
然后該方法調用了emitInput()方法傳入了一個值 這個方法又執行了this.$emit('input', val)
vue中 關於$emit的用法 1、父組件可以使用 props 把數據傳給子組件。 2、子組件可以使用 $emit 觸發父組件的自定義事件。
vm.$emit( event, arg ) //觸發當前實例上的事件
vm.$on( event, fn );//監聽event事件后運行 fn;
具體使用還是多學習Vue吧
最后 handleImageSuccess中this.emitInput(res.data)
這條語句
最終返回的就是上傳圖片的url並回顯為upload 組件上的圖片
步驟
-
修改action屬性為自己實現的接口,定義好返回的json,把圖片存在json里返回給前端,下面的response參數要用到
-
在handleImageSuccess中添加response 將 this.$emit('input', val)修改為 this.emitInput(res.data) res.data為圖片地址
-
完