123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- <template>
- <view>
- <view class="upload">
- <block v-for="(upload,index) in uploads" :key="index">
- <view class="uplode-file">
- <image v-if="types == 'image'" class="uploade-img" :src="upload" :data-src="upload" @tap="previewImage"></image>
- <image v-if="types == 'image'" class="clear-one-icon" :src="clearIcon" @tap="delImage(index)"></image>
- <video v-if="types == 'video'" class="uploade-img" :src="upload" controls>
- <cover-image v-if="types == 'video'" class="clear-one-icon" :src="clearIcon" @tap="delImage(index)"></cover-image>
- </video>
- </view>
- </block>
- <view class="uploader-input-box" v-if="uploads.length < uploadCount">
- <view class="uploader-input" @tap="chooseUploads"></view>
- </view>
- </view>
- <button type="primary" v-if="types == 'image'" @tap="upload">上传</button>
- </view>
- </template>
- <script>
- export default{
- props: {
- types: {
- type: String,
- default: 'image'
- },
- dataList: {
- type: Array,
- default: function() {
- return []
- }
- },
- clearIcon: {
- type: String,
- default: 'http://img1.imgtn.bdimg.com/it/u=451604666,2295832001&fm=26&gp=0.jpg'
- },
- uploadUrl: {
- type: String,
- default: ''
- },
- deleteUrl: {
- type: String,
- default: ''
- },
- uploadCount: {
- type: Number,
- default: 1
- },
- //上传图片大小 默认3M
- upload_max: {
- type: Number,
- default: 3
- }
- },
- data(){
- return {
- //上传的图片地址
- uploadImages: [],
- //展示的图片地址
- uploads: [],
- // 超出限制数组
- exceeded_list: [],
- }
- },
- watch:{
- dataList() {
- this.uploads = this.dataList
- }
- },
- methods:{
- previewImage (e) {
- var current = e.target.dataset.src
- uni.previewImage({
- current: current,
- urls: this.dataList
- })
- },
- chooseUploads(){
- switch (this.types){
- case 'image':
- uni.chooseImage({
- count: this.uploadCount - this.uploads.length, //默认9
- sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
- sourceType: ['album', 'camera'], //从相册选择
- success: (res) => {
- for(let i = 0; i< res.tempFiles.length; i++){
- if(Math.ceil(res.tempFiles[i].size / 1024) < this.upload_max * 1024){
- this.uploads.push(res.tempFiles[i].path)
- this.uploadImages.push(res.tempFiles[i].path)
- }else {
- this.exceeded_list.push(i === 0 ? 1 : i + 1);
- uni.showModal({
- title: '提示',
- content: `第${[...new Set(this.exceeded_list)].join(',')}张图片超出限制${this.upload_max}MB,已过滤`
- });
- }
- }
- },
- fail: (err) => {
- uni.showModal({
- content: JSON.stringify(err)
- });
- }
- });
- break;
- case 'video' :
- uni.chooseVideo({
- sourceType: ['camera', 'album'],
- success: (res) => {
- if(Math.ceil(res.size / 1024) < this.upload_max * 1024){
- this.uploads.push(res.tempFilePath)
- uni.uploadFile({
- url: this.uploadUrl, //仅为示例,非真实的接口地址
- filePath: res.tempFilePath,
- name: 'file',
- //请求参数
- formData: {
- 'user': 'test'
- },
- success: (uploadFileRes) => {
- this.$emit('successVideo',uploadFileRes)
- }
- });
- }else {
- uni.showModal({
- title: '提示',
- content: `第${[...new Set(this.exceeded_list)].join(',')}张视频超出限制${this.upload_max}MB,已过滤`
- });
- }
- },
- fail: (err) => {
- uni.showModal({
- content: JSON.stringify(err)
- });
- }
- });
- break;
- }
- },
- delImage(index){
- if(this.uploads[index].substring(0,4) !== 'http'){
- this.uploads.splice(index,1)
- return;
- };
- if(!this.deleteUrl) {
- uni.showModal({
- content: '请填写删除接口'
- });
- return;
- };
- uni.request({
- url: this.deleteUrl,
- method: 'DELETE',
- data: {
- image: this.dataList[index]
- },
- success: res => {
- this.uploads.splice(index,1)
- },
- });
- },
- upload(){
- debugger
- if(!this.uploadUrl) {
- uni.showModal({
- content: '请填写上传接口'
- });
- return;
- };
- for (let i of this.uploadImages) {
- uni.uploadFile({
- url: this.uploadUrl, //仅为示例,非真实的接口地址
- filePath: i,
- name: 'file',
- //请求参数
- formData: {
- 'user': 'test'
- },
- success: (uploadFileRes) => {
- this.$emit('successImage',uploadFileRes)
- }
- });
- }
- }
- }
- }
- </script>
- <style scoped>
- .upload {
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- }
- .uplode-file {
- margin: 10upx;
- width: 210upx;
- height: 210upx;
- position: relative;
- }
- .uploade-img {
- display: block;
- width: 210upx;
- height: 210upx;
- }
- .clear-one{
- position: absolute;
- top: -10rpx;
- right: 0;
- }
- .clear-one-icon{
- position: absolute;
- width: 20px;
- height: 20px;
- top: 0;
- right: 0;
- z-index: 9;
- }
- .uploader-input-box {
- position: relative;
- margin:10upx;
- width: 208upx;
- height: 208upx;
- border: 2upx solid #D9D9D9;
- }
- .uploader-input-box:before,
- .uploader-input-box:after {
- content: " ";
- position: absolute;
- top: 50%;
- left: 50%;
- -webkit-transform: translate(-50%, -50%);
- transform: translate(-50%, -50%);
- background-color: #D9D9D9;
- }
- .uploader-input-box:before {
- width: 4upx;
- height: 79upx;
- }
- .uploader-input-box:after {
- width: 79upx;
- height: 4upx;
- }
- .uploader-input-box:active {
- border-color: #999999;
- }
- .uploader-input-box:active:before,
- .uploader-input-box:active:after {
- background-color: #999999;
- }
- .uploader-input {
- position: absolute;
- z-index: 1;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- opacity: 0;
- }
- </style>
|