1、安裝Element-ui
npm i element-ui -s
2、安裝阿里雲的OSS
npm install ali-oss
3、使用element-ui 默認的 upload組件
templeate部分:
<el-upload class="" action="" :show-file-list="false" :http-request="fnUploadRequest" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload"> <img v-if="imageUrl" :src="imageUrl" class="avatar" alt=""> <i v-else class="el-icon-plus avatar-uploader-icon"></i> </el-upload>
由於我們使用了 阿里雲OSS方案,因此拋棄掉了element自帶的上傳方式,故class和action寫不寫無關緊要,需要我們自己重寫 http-request 方法
script部分:
1 //首先第一行引入 ali-oss 插件並配置: 2 const OSS = require('ali-oss'); 3 const client= new OSS({ 4 accessKeyId: 'your access key', // 查看你自己的阿里雲KEY 5 accessKeySecret: 'your access secret', // 查看自己的阿里雲KEYSECRET 6 bucket: 'your bucket name', // 你的 OSS bucket 名稱 7 region: 'oss-cn-beijing', // bucket 所在地址,我的是 華北2 北京 8 cname:true, // 開啟自定義域名上傳 9 endpoint:"file.xxxx.live" // 自己的域名 10 });
為了不透露個人信息,均已修改過
我這里使用了 cname 和 endpoint 也就是支持上傳自定義域名,可以到阿里雲的管理后台綁定你自己的域名(需要購買),這里有沒有域名不影響使用,系統會自動分配,
更多配置查看官方文檔:
https://help.aliyun.com/document_detail/64097.html?spm=a2c4g.11186623.6.1414.725d3a07k8kyni
重點代碼段:
1 export default { 2 name: "upload", 3 data() { 4 return { 5 imageUrl: '' 6 }; 7 }, 8 methods:{ 9 //圖片上傳成功回調 10 handleAvatarSuccess(res) { 11 if (res) this.imageUrl = res.url 12 }, 13 beforeAvatarUpload(file) { 14 const isJPG = file.type === 'image/jpeg'; 15 const isLt2M = file.size / 1024 / 1024 < 2; 16 17 if (!isJPG) { 18 this.$message.error('上傳頭像圖片只能是 JPG 格式!'); 19 } 20 if (!isLt2M) { 21 this.$message.error('上傳頭像圖片大小不能超過 2MB!'); 22 } 23 return isJPG && isLt2M; 24 }, 25 26 async fnUploadRequest(options) { 27 try { 28 let file = options.file; // 拿到 file 29 let fileName = file.name.substr(0,file.name.lastIndexOf('.')) 30 let date = new Date().getTime() 31 let fileNames = `${date}_${fileName}` // 拼接文件名,保證唯一,這里使用時間戳+原文件名 32 // 上傳文件,這里是上傳到OSS的 uploads文件夾下 33 client.put("uploads/"+fileNames, file).then(res=>{ 34 if (res.res.statusCode === 200) { 35 options.onSuccess(res) 36 }else { 37 options.onError("上傳失敗") 38 } 39 }) 40 }catch (e) { 41 options.onError("上傳失敗") 42 } 43 } 44 } 45 }
通過手動拋出
options.onSuccess(res) 來調用 handleAvatarSuccess 函數,拿到圖片地址
使用分片上傳:
1 client.multipartUpload("uploads/"+fileNames, file,{ 2 progress: async function (p) { 3 let e = {} 4 e.percent = p * 100 5 options.onProgress(e) 6 } 7 }).then(res=>{ 8 if (res.res.statusCode === 200) { 9 options.onSuccess(res) 10 }else { 11 options.onError("上傳失敗") 12 } 13 })
只是把 這一點代碼更換了而已,跟最基礎的 put 上傳其實沒什么不同,但是分片上傳可以斷點續傳,一般用作大文件,而且返回值也會有所不同
multipartUpload 的 第三個參數是一個配置參數,可以參考官方文檔
https://help.aliyun.com/document_detail/111268.html?spm=a2c4g.11186623.6.1441.39932847L2sCiI
稍稍改變回調函數,也能回顯
//圖片回調
handleAvatarSuccess(res) {
console.log(res) // 有興趣的自己查看API的返回格式
if (res) this.imageUrl = res.res.requestUrls[0]
},