<template> <view class="upload-image"> <view class="pull-left" :class="itemClass" v-for="(item, index) in value" :key="item.url"> <view class="imgwarp"> <view style="margin-bottom: 100%;" class="text-center"> <!-- <u-loading-page v-if="item.loading" font-size="28" :loading="true"></u-loading-page> --> <view style="margin-top: 20px;" v-if="item.loading" class=""> <u-loading-icon ></u-loading-icon> </view> <view class="img-square-warp" v-else @click="clickImg(index)" style="position: absolute;top: 0;right: 0;left: 0;bottom: 0;"> <image :src="item.type=='image' ? item.url+'?x-oss-process=image/resize,m_fill,h_200,w_200,limit_0' : item.video_img" mode="widthFix" class="img-max img-square"/> </view> </view> <span v-if="showRemove" class="img-remove" @click="remove(index)"></span> </view> </view> <view class="pull-left" :class="itemClass"> <view class="imgwarp ui-flex ui-flex-align-center ui-flex-center" v-if="max > value.length" @click="choose()"> <u-icon name="camera-fill" size="48" ></u-icon> </view> </view> <u-popup :show="showPopup" mode="bottom" @close="showPopup = false"> <view class="ui-flex-row u-border-bottom"> <view class="ui-flex-1 ui-p f12 text-center u-border-right">照片</view> <!-- <view class="ui-flex-1 ui-p f12 text-center" v-if="chooseVideo">视频</view> --> </view> <view class="ui-flex-row"> <view class="ui-flex-1 ui-p" @click="choose('image', 'camera')"> <u-icon label="拍摄照片" size="28px" space="7px" labelSize="12px" labelPos="bottom" name="camera"></u-icon> </view> <view class="ui-flex-1 ui-p u-border-right" @click="choose('image', 'album')"> <u-icon label="选择照片" size="28px" space="7px" labelSize="12px" labelPos="bottom" name="photo"></u-icon> </view> <!-- <view class="ui-flex-1 ui-p" @click="choose('video', 'camera')" v-if="chooseVideo"> <u-icon label="拍摄视频" size="28px" space="7px" labelSize="12px" labelPos="bottom" name="play-circle"></u-icon> </view> <view class="ui-flex-1 ui-p" @click="choose('video', 'album')" v-if="chooseVideo"> <u-icon label="选择视频" size="28px" space="7px" labelSize="12px" labelPos="bottom" name="plus-circle"></u-icon> </view> --> </view> </u-popup> </view> </template> <script> // import Request from '@/common/base-request.js' // import uLoadingIcon from '@/uni_modules/uview-ui/components/u-loading-icon/u-loading-icon.vue' export default { comments : { }, props : { max : { default : 1 }, dir : { required: false }, itemClass : { type : String, default : '', }, value : { type : Array, default : function(){ return [] }, }, showRemove : { default : true, }, crop : { type : [Object, undefined], default: undefined }, type : { type : String, default : 'image' } }, computed : { chooseVideo (){ if(this.type != 'all'){ return false; } return true; } }, data() { return { showPopup : false, video: { // isVideo : true, // loading : true, // videoUrl : 'xxx', // videoCover : 'xxx' } } }, methods : { remove : function(index){ this.value.splice(index, 1); this.$emit("input",this.value) }, clickImg(index){ if(this.showRemove){ return } this.selectIndex = index; return this.showPopup = true; }, choose(type, sourceType){ if(!type){ this.selectIndex = null; return this.showPopup = true; } this.showPopup = false; if(type == 'image'){ uni.chooseImage({ count: this.max - this.value.length, //默认9 sourceType : [sourceType], sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有 crop : this.crop, // sourceType: ['album'], //从相册选择 success: (fileList) => { this.toUploadImgs(fileList); }, }) }else{ uni.chooseVideo({ sourceType: [sourceType], maxDuration : 60, success: (res) => { // console.log(res); // self.src = res.tempFilePath; this.video = { isVideo : true, loading : true, videoUrl : '', videoCover : '', } let filePath = { filePath : res.tempFilePath, // #ifdef H5 fileInfo : res.tempFile // #endif }; this.value.push({ loading :true, type : 'video', }) let index=this.value.length-1 this.$emit("input",this.value) this.$uploadOSS('/leapi/upload', filePath, this.dir + '/', (res) => { if(res){ let obj={ url : res.imgurl, video_img : res.imgurl + '?x-oss-process=video/snapshot,t_1000,f_jpg,w_300,h_300,m_fast', loading : false, type : 'video', } this.$set(this.value,index,obj) // this.list[index].url = res.imgurl // this.list[index].video_img = res.imgurl + '?x-oss-process=video/snapshot,t_1000,f_jpg,w_300,h_300,m_fast'; // this.list[index].loading = false this.video.loading = false, this.video.videoUrl = res.imgurl; this.video.videoCover = res.imgurl + '?x-oss-process=video/snapshot,t_1000,f_jpg,w_300,h_300,m_fast'; this.$emit("input",this.value) } }) } }); } }, toUploadImgs : function(fileList){ console.log(fileList,"filelist"); if(!fileList.tempFilePaths){ return; } fileList.tempFilePaths.forEach((filePath, index) => { let file={ filePath : filePath, // #ifdef H5 fileInfo : fileList.tempFiles[index] // #endif } this.value.push({ file :file, loading :true, type : 'image', }) let list_index=this.value.length-1 console.log(list_index,"list_indexlist_index",file) uni.uploadFile({ url: 'http://125.124.170.221:8000/api/upload', filePath: file.filePath, name: 'file', success: (myres) => { console.log(myres,"mures"); let { data } = JSON.parse(myres.data); console.log(data,"data"); let obj={ url : data.url, loading : false, type : 'image' } this.$set(this.value,list_index,obj) this.value[list_index].url = data.url this.value[list_index].loading = false this.value[list_index].type = 'image' delete this.value[list_index].file this.$emit("input",this.value) }, fail : (err=>{ console.log(err,"err"); }) }); // this.$uploadOSS('/leapi/upload', file, this.dir + '/', (res) => { // if(res){ // let obj={ // url : res.imgurl, // thumburl : res.imgurl + '?x-oss-process=style%2Fsquare200', // loading : false, // type : 'image' // } // this.$set(this.value,list_index,obj) // // this.value[list_index].url = res.imgurl // // this.value[list_index].thumburl = res.imgurl + '?x-oss-process=style%2Fsquare200', // // this.value[list_index].loading = false // // this.value[list_index].type = 'image' // // delete this.value[list_index].file // // this.list[index].loading = false, // // this.list[index].thumburl = res.imgurl + '?x-oss-process=style%2Fsquare200'; // // this.list[index].imgurl = res.imgurl; // } // // // this.$emit("input",this.value) // }) }); } }, } </script> <style scoped> .upload-image .img-max{ width: 90%; margin: 5%; } .upload-image .imgwarp{ width: 76px; height: 76px; line-height: 76px; margin-right: 10px; margin-bottom: 10px; color: #ccc; border: 1px dashed; position: relative; box-sizing: content-box; } .upload-image .img-remove{ position: absolute; right: -10px; top: -8px; width: 40px; height: 40px; z-index: 100; text-align: right; line-height: normal; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4NDEwQzFDNTFFMEExMUU0QURCREEwODgzQjUwQjFDRiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4NDEwQzFDNjFFMEExMUU0QURCREEwODgzQjUwQjFDRiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjg0MTBDMUMzMUUwQTExRTRBREJEQTA4ODNCNTBCMUNGIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjg0MTBDMUM0MUUwQTExRTRBREJEQTA4ODNCNTBCMUNGIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+9KF98QAABA1JREFUeNrMmmlIVFEYhr8ZjfYoMtsjTIkWQtMsXCqkspQWyB8SlmWiSSq0+L/fbbSbWZZZ4Q+DiBYEi8olkzYistL21JnIjGiXrPebORPXcWa8Z+be8b7wcmaGOec898y93znnO2MiH5W6Pns4ivnCs+BJcDA8WHzlG/wBfgs/gqvhm+Wnij770q/JS9j+KFLgNHgxHCDZxB+4Ci6DK3ARv3QFB/BAFDnwVng8aaNWeA9ciAv4oTk4oJehOAhPIX30As4D/FVNwAE8AMVeMdL+UCH/oriAn16DA3o0iktwFPlX9+EkwFulwQEdgqISDqW+UTO8BPCvVIMDeoIIW5Opb/Uajgf8+17BAT0IRQ0cQcbQAzgO8N+VH5pdfHGfgaBJsOz3OOIY7SQUl8mYSsaoX+kBLsLeYx3jtK96Cc9whEnlrZJjYGhWiHIuMSvWHttlW1qRlEjzoiOlCebHzqOsDWlkNptlqxaIO4MCxQe8YBon08LK5KWUmrKKurq6bO/rG+6phs7OWGeDNsHFJ8/8b0OFxsKr4bOOS14rO9IMbfvJ0Hle9kZVI6+EZi2Mi6HM9DWyo25jNYv19CKZmh/b27uNkhp4Z2gWt/H0+QtZ8EXMHDAzPCoRb6Qu+11LK1msVpozO5xMJntg4jI6MoJaLRZ639KmCrqo5DTdqq2XBedG6hk8Ey9iZGszfJsF8JGe4eNj5tKmjelaQTvUwg/nNG9r3264aytzszP+gzluG1a/wEA9oFnTGDzMlxZ6g9cBmhXK4GN8bcUdvFIaQrOCuPVhWrTE8IeKSlzGZI2hWUPMpKECAtxv9n93dmo6/zP4Fy0a4uiRk5nuchqXmaRU6iv3YtEC2lX0kJ2kZOZA7qlJD2i+pw8fK9ELvpmjylNepGsNrXwQN2e5DpVqF2Yu1MgzJ2enUvWCll0eqNROBufcRYGb/adP0DrBc94x1yyyplVS8+3UsB7QR0+UeozTdXd6xnluIzgoSHa0r4G5w9F7mUzN46Xn6EZNXTfo6ro70pNUecUFunilUha8TLkDOg/vEjuMXsUd887lL8rGZ02qoJ2XB6OCRnoDzfdUhfMufwvZk5tG1jbcJnudd/mFIgVgVDHbkR6ZLJGvyDMweL4y9dxtVfT44b0mhMeJeDnbYNAnAb27t9xhPvzQQNDMkutqddhNIiu6HH5jAGhmWO6cqXU34iTy0Ql9/LBy3wmucuPkaZpHBa4YS/ZjDX+L+4wVDCQFLuAtAv6YH6GLBLTHfYLMcSHnzg+QQY4LVZ8Ii1BZjJefyH70PVQjYJ7Gd8AZgG5UW8nXI/F08RB7cyR+HS4lfxyJu7mIESgWiGdhOtkT8Hw+OsSxsYWtIko8gWvJ/ieEDl/6/SfAACQq2Uox69/XAAAAAElFTkSuQmCC) no-repeat 15px 0; background-size: 23px auto; } .upload-image:after{ content: ' '; display: block; clear: both; } .uloading{ position: absolute; top : calc(50% - 7px); left: calc(50% - 7px); /* #ifndef H5 */ top : 0; /* #endif */ } </style>