| | |
| | | <template> |
| | | <!--本文件由FirstUI授权予四川政采招投标咨询有限公司(会员ID: 1 63,营业执照号:9 1 51 0 1313 3 2 0061 9 3K)专用,请尊重知识产权,勿私下传播,违者追究法律责任。--> |
| | | <view class="fui-upload__wrap"> |
| | | <view class="fui-upload__item" :style="{width:width+'rpx',height:height+'rpx',borderRadius:radius+'rpx'}" |
| | | <view class="fui-upload__item" |
| | | :style="$util.checkFileExtensions(item)?'':{width:width+'rpx',height:height+'rpx',borderRadius:radius+'rpx'}" |
| | | v-for="(item,index) in urls" :key="index"> |
| | | <image src="/static/WPS.png" mode="aspectFill" @tap.sto='showTip' :style="{width:width+'rpx',height:height+'rpx',borderRadius:radius+'rpx'}" v-if="checkFileExtensions(item)"></image> |
| | | <image v-else class="fui-upload__img" :style="{width:width+'rpx',height:height+'rpx',borderRadius:radius+'rpx'}" |
| | | :src="item" mode="aspectFill" @tap.stop="previewImage(index)"></image> |
| | | <u-tag :text="item.match(/\/([^\/]*)$/)[1]" size="mini" v-if="$util.checkFileExtensions(item)" |
| | | @click.stop='showTip(item)'></u-tag> |
| | | <!-- // <image src="/static/WPS.png" mode="aspectFill" @tap.stop='showTip' |
| | | // :style="{width:width+'rpx',height:height+'rpx',borderRadius:radius+'rpx'}" |
| | | // v-if="checkFileExtensions(item)"></image> --> |
| | | <image v-else class="fui-upload__img" |
| | | :style="{width:width+'rpx',height:height+'rpx',borderRadius:radius+'rpx'}" :src="item" mode="aspectFill" |
| | | @tap.stop="previewImage(index)"></image> |
| | | <view class="fui-upload__mask" v-if="status[index]!=='success' && status[index]!=='preupload' "> |
| | | <fui-icon name="warning-fill" color="#fff" :size="48" v-if="status[index]==='error'"></fui-icon> |
| | | <text class="fui-reupload__btn" @tap.stop="reUpload(index)" v-if="status[index]==='error'">重新上传</text> |
| | |
| | | <fui-icon name="close" color="#fff" :size="32"></fui-icon> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="fui-upload__item" |
| | | :class="[borderColor && borderColor!==true?'fui-upload__border':'fui-upload__noborder']" |
| | | :style="{width:width+'rpx',borderRadius:radius+'rpx',borderColor:borderColor,borderStyle:borderSytle}" |
| | | v-if="showAdd" @tap.stop="chooseImage"> |
| | | <slot> |
| | | <u-button type="primary" text="上传" size="small"></u-button> |
| | | <!-- <fui-icon name="plus" :size="addSize" :color="addColor"></fui-icon> --> |
| | | </slot> |
| | | </view> |
| | | <!-- <view class="fui-upload__item" |
| | | :class="[borderColor && borderColor!==true?'fui-upload__border':'fui-upload__noborder']" |
| | | :style="{width:width+'rpx',height:height+'rpx',background:background,borderRadius:radius+'rpx',borderColor:borderColor,borderStyle:borderSytle}" |
| | | v-if="showAdd" @tap.stop="chooseImage"> |
| | | <slot> |
| | | <fui-icon name="plus" :size="addSize" :color="addColor"></fui-icon> |
| | | </slot> |
| | | </view> |
| | | </view> --> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | return ['album', 'camera'] |
| | | } |
| | | }, |
| | | isSource: { |
| | | type: Boolean, |
| | | default () { |
| | | return false |
| | | } |
| | | }, |
| | | //图片后缀名限制 |
| | | suffix: { |
| | | type: Array, |
| | |
| | | param: { |
| | | type: [Number, String], |
| | | default: 0 |
| | | }, |
| | | fileType: { |
| | | type: String, |
| | | default: 'file' |
| | | }, |
| | | fileExtension: { |
| | | type: Array, |
| | | default: [] |
| | | } |
| | | }, |
| | | data() { |
| | |
| | | urls: [], |
| | | tempFiles: [], |
| | | //preupload、uploading、success、error |
| | | status: [] |
| | | status: [], |
| | | formDataNew: {} |
| | | }; |
| | | }, |
| | | created() { |
| | |
| | | } |
| | | }, |
| | | methods: { |
| | | showTip(){ |
| | | this.$util.showToast({ |
| | | title: "文件类型不支持预览!", |
| | | }) |
| | | showTip(src) { |
| | | // this.$util.showToast({ |
| | | // title: "文件类型不支持预览!", |
| | | // }) |
| | | this.$util.previewWechat(src) |
| | | }, |
| | | checkFileExtensions(str) { |
| | | const extensions = ['pdf', 'doc', 'docx', 'xls', 'xlsx']; |
| | | return extensions.some(extension => str.includes(extension)); |
| | | }, |
| | | |
| | | initData(urls) { |
| | | urls = urls || [] |
| | | this.status = []; |
| | |
| | | }, |
| | | chooseImage() { |
| | | let max = Number(this.max) |
| | | uni.chooseImage({ |
| | | count: max === -1 ? 9 : max - this.urls.length, |
| | | sizeType: this.sizeType, |
| | | sourceType: this.sourceType, |
| | | success: (e) => { |
| | | let imageArr = []; |
| | | for (let i = 0; i < e.tempFiles.length; i++) { |
| | | let len = this.urls.length; |
| | | if (len >= max && max !== -1) { |
| | | this.toast(`最多可上传${max}张图片`); |
| | | break; |
| | | } |
| | | //过滤图片类型 |
| | | let path = e.tempFiles[i].path; |
| | | |
| | | if (this.suffix.length > 0) { |
| | | let format = "" |
| | | // #ifdef H5 |
| | | let type = e.tempFiles[i].type; |
| | | format = type.split('/')[1] |
| | | // #endif |
| | | |
| | | // #ifndef H5 |
| | | format = path.split(".")[(path.split(".")).length - 1]; |
| | | // #endif |
| | | |
| | | if (this.suffix.indexOf(format) == -1) { |
| | | let text = `只能上传 ${this.suffix.join(',')} 格式图片!` |
| | | this.toast(text); |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | //过滤超出大小限制图片 |
| | | let size = e.tempFiles[i].size; |
| | | |
| | | if (Number(this.size) * 1024 * 1024 < size) { |
| | | let err = `单张图片大小不能超过:${this.size}MB` |
| | | this.toast(err); |
| | | continue; |
| | | } |
| | | imageArr.push(path) |
| | | this.urls.push(path) |
| | | this.tempFiles.push(e.tempFiles[i]) |
| | | this.status.push(this.immediate ? 'uploading' : 'preupload') |
| | | } |
| | | this.onComplete('choose') |
| | | let start = this.urls.length - imageArr.length |
| | | if (this.immediate) { |
| | | for (let j = 0; j < imageArr.length; j++) { |
| | | let index = start + j |
| | | this.uploadImage(index, imageArr[j]).then((res) => { |
| | | this._success(res) |
| | | }).catch((res) => { |
| | | this._error(res) |
| | | }) |
| | | } |
| | | } |
| | | this.$api.GetToken().then(res => { |
| | | this.formDataNew = { |
| | | policy: res.data.policy, //表单域 |
| | | 'x-oss-signature-version': res.data.x_oss_signature_version, //指定签名的版本和算法 |
| | | 'x-oss-credential': res.data.x_oss_credential, //指明派生密钥的参数集 |
| | | 'x-oss-date': res.data.x_oss_date, //请求的时间 |
| | | 'x-oss-signature': res.data.signature, //签名认证描述信息 |
| | | 'x-oss-security-token': res.data.security_token, //安全令牌 |
| | | 'success_action_status': "200" //上传成功后响应状态码 |
| | | } |
| | | }) |
| | | if (this.isSource) { |
| | | uni.chooseImage({ |
| | | count: max === -1 ? 9 : max - this.urls.length, |
| | | sizeType: this.sizeType, |
| | | sourceType: this.sourceType, |
| | | success: (e) => { |
| | | let imageArr = []; |
| | | for (let i = 0; i < e.tempFiles.length; i++) { |
| | | let len = this.urls.length; |
| | | if (len >= max && max !== -1) { |
| | | this.toast(`最多可上传${max}张图片`); |
| | | break; |
| | | } |
| | | //过滤图片类型 |
| | | let path = e.tempFiles[i].path; |
| | | |
| | | if (this.suffix.length > 0) { |
| | | let format = "" |
| | | // #ifdef H5 |
| | | let type = e.tempFiles[i].type; |
| | | format = type.split('/')[1] |
| | | // #endif |
| | | |
| | | // #ifndef H5 |
| | | format = path.split(".")[(path.split(".")).length - 1]; |
| | | // #endif |
| | | |
| | | if (this.suffix.indexOf(format) == -1) { |
| | | let text = `只能上传 ${this.suffix.join(',')} 格式图片!` |
| | | this.toast(text); |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | //过滤超出大小限制图片 |
| | | let size = e.tempFiles[i].size; |
| | | |
| | | if (Number(this.size) * 1024 * 1024 < size) { |
| | | let err = `单张图片大小不能超过:${this.size}MB` |
| | | this.toast(err); |
| | | continue; |
| | | } |
| | | imageArr.push(path) |
| | | this.urls.push(path) |
| | | this.tempFiles.push(e.tempFiles[i]) |
| | | this.status.push(this.immediate ? 'uploading' : 'preupload') |
| | | } |
| | | this.onComplete('choose') |
| | | let start = this.urls.length - imageArr.length |
| | | if (this.immediate) { |
| | | for (let j = 0; j < imageArr.length; j++) { |
| | | let index = start + j |
| | | let obj = JSON.parse(JSON.stringify(this.formDataNew)) |
| | | obj.key = this.$util.generateTimestampWithRandom(imageArr[j]) |
| | | this.uploadImage(index, imageArr[j], null, obj).then((res) => { |
| | | this._success(res) |
| | | }).catch((res) => { |
| | | this._error(res) |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | }) |
| | | } else { |
| | | wx.chooseMessageFile({ |
| | | count: max === -1 ? 9 : max - this.urls.length, |
| | | type: this.fileType, |
| | | success: (e) => { |
| | | let imageArr = []; |
| | | for (let i = 0; i < e.tempFiles.length; i++) { |
| | | let len = this.urls.length; |
| | | if (len >= max && max !== -1) { |
| | | this.toast(`最多可上传${max}个文件`); |
| | | break; |
| | | } |
| | | //过滤文件类型 |
| | | let path = e.tempFiles[i].path; |
| | | if (this.suffix.length > 0) { |
| | | let format = "" |
| | | // #ifdef H5 |
| | | let type = e.tempFiles[i].type; |
| | | format = type.split('/')[1] |
| | | console.log(format, 'eeeeeeeeeeeeee’'); |
| | | // #endif |
| | | |
| | | // #ifndef H5 |
| | | format = path.split(".")[(path.split(".")).length - 1]; |
| | | // #endif |
| | | console.log(format); |
| | | if (this.suffix.indexOf(format) == -1) { |
| | | let text = `只能上传 ${this.suffix.join(',')} 格式!` |
| | | this.toast(text); |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | //过滤超出大小限制图片 |
| | | let size = e.tempFiles[i].size; |
| | | |
| | | if (Number(this.size) * 1024 * 1024 < size) { |
| | | let err = `文件大小不能超过:${this.size}MB` |
| | | this.toast(err); |
| | | continue; |
| | | } |
| | | imageArr.push(path) |
| | | this.urls.push(path) |
| | | this.tempFiles.push(e.tempFiles[i]) |
| | | this.status.push(this.immediate ? 'uploading' : 'preupload') |
| | | } |
| | | this.onComplete('choose') |
| | | let start = this.urls.length - imageArr.length |
| | | if (this.immediate) { |
| | | for (let j = 0; j < imageArr.length; j++) { |
| | | let index = start + j |
| | | let obj = JSON.parse(JSON.stringify(this.formDataNew)) |
| | | obj.key = this.$util.generateTimestampWithRandom(imageArr[j]) |
| | | this.uploadImage(index, imageArr[j], null, obj).then((res) => { |
| | | this._success(res) |
| | | }).catch((res) => { |
| | | this._error(res) |
| | | }) |
| | | } |
| | | } |
| | | }, |
| | | fail: () => {} |
| | | }) |
| | | } |
| | | |
| | | // uni.chooseFile({ |
| | | // count: max === -1 ? 9 : max - this.urls.length, |
| | | // extension: ['.doc', '.pdf', '.docx'], |
| | | // success: (e) => { |
| | | // let imageArr = []; |
| | | // for (let i = 0; i < e.tempFiles.length; i++) { |
| | | // let len = this.urls.length; |
| | | // if (len >= max && max !== -1) { |
| | | // this.toast(`最多可上传${max}个文件`); |
| | | // break; |
| | | // } |
| | | // //过滤文件类型 |
| | | // let path = e.tempFiles[i].path; |
| | | // if (this.suffix.length > 0) { |
| | | // let format = "" |
| | | // // #ifdef H5 |
| | | // let type = e.tempFiles[i].type; |
| | | // format = type.split('/')[1] |
| | | // // #endif |
| | | |
| | | // // #ifndef H5 |
| | | // format = path.split(".")[(path.split(".")).length - 1]; |
| | | // // #endif |
| | | // console.log(format); |
| | | // if (this.suffix.indexOf(format) == -1) { |
| | | // // let text = `只能上传 ${this.suffix.join(',')} 格式!` |
| | | // let text = `只能上传 doc,docx,pdf 格式!` |
| | | // this.toast(text); |
| | | // continue; |
| | | // } |
| | | // } |
| | | |
| | | // //过滤超出大小限制图片 |
| | | // let size = e.tempFiles[i].size; |
| | | |
| | | // if (Number(this.size) * 1024 * 1024 < size) { |
| | | // let err = `文件大小不能超过:${this.size}MB` |
| | | // this.toast(err); |
| | | // continue; |
| | | // } |
| | | // imageArr.push(path) |
| | | // this.urls.push(path) |
| | | // this.tempFiles.push(e.tempFiles[i]) |
| | | // this.status.push(this.immediate ? 'uploading' : 'preupload') |
| | | // } |
| | | // this.onComplete('choose') |
| | | // let start = this.urls.length - imageArr.length |
| | | // if (this.immediate) { |
| | | // for (let j = 0; j < imageArr.length; j++) { |
| | | // let index = start + j |
| | | // this.uploadImage(index, imageArr[j]).then((res) => { |
| | | // this._success(res) |
| | | // }).catch((res) => { |
| | | // this._error(res) |
| | | // }) |
| | | // } |
| | | // } |
| | | // } |
| | | |
| | | // }) |
| | | }, |
| | | uploadImage(index, imgUrl, url) { |
| | | // chooseImage() { |
| | | // let max = Number(this.max) |
| | | // uni.chooseImage({ |
| | | // count: max === -1 ? 9 : max - this.urls.length, |
| | | // sizeType: this.sizeType, |
| | | // sourceType: this.sourceType, |
| | | // success: (e) => { |
| | | // let imageArr = []; |
| | | // for (let i = 0; i < e.tempFiles.length; i++) { |
| | | // let len = this.urls.length; |
| | | // if (len >= max && max !== -1) { |
| | | // this.toast(`最多可上传${max}张图片`); |
| | | // break; |
| | | // } |
| | | // //过滤图片类型 |
| | | // let path = e.tempFiles[i].path; |
| | | |
| | | // if (this.suffix.length > 0) { |
| | | // let format = "" |
| | | // // #ifdef H5 |
| | | // let type = e.tempFiles[i].type; |
| | | // format = type.split('/')[1] |
| | | // // #endif |
| | | |
| | | // // #ifndef H5 |
| | | // format = path.split(".")[(path.split(".")).length - 1]; |
| | | // // #endif |
| | | |
| | | // if (this.suffix.indexOf(format) == -1) { |
| | | // let text = `只能上传 ${this.suffix.join(',')} 格式图片!` |
| | | // this.toast(text); |
| | | // continue; |
| | | // } |
| | | // } |
| | | |
| | | // //过滤超出大小限制图片 |
| | | // let size = e.tempFiles[i].size; |
| | | |
| | | // if (Number(this.size) * 1024 * 1024 < size) { |
| | | // let err = `单张图片大小不能超过:${this.size}MB` |
| | | // this.toast(err); |
| | | // continue; |
| | | // } |
| | | // imageArr.push(path) |
| | | // this.urls.push(path) |
| | | // this.tempFiles.push(e.tempFiles[i]) |
| | | // this.status.push(this.immediate ? 'uploading' : 'preupload') |
| | | // } |
| | | // this.onComplete('choose') |
| | | // let start = this.urls.length - imageArr.length |
| | | // if (this.immediate) { |
| | | // for (let j = 0; j < imageArr.length; j++) { |
| | | // let index = start + j |
| | | // this.uploadImage(index, imageArr[j]).then((res) => { |
| | | // this._success(res) |
| | | // }).catch((res) => { |
| | | // this._error(res) |
| | | // }) |
| | | // } |
| | | // } |
| | | // } |
| | | // }) |
| | | // }, |
| | | uploadImage(index, imgUrl, url, formDataNew) { |
| | | return new Promise((resolve, reject) => { |
| | | uni.uploadFile({ |
| | | url: this.url || url, |
| | | name: this.name, |
| | | header: this.header, |
| | | formData: this.formData, |
| | | formData: formDataNew, |
| | | filePath: imgUrl, |
| | | success: (res) => { |
| | | if (res.statusCode === 200) { |
| | | res.data = |
| | | `https://appimchat.oss-cn-chengdu.aliyuncs.com/${formDataNew.key}` |
| | | this.$set(this.status, index, 'success') |
| | | resolve({ |
| | | res, |
| | |
| | | /* #endif */ |
| | | align-items: center; |
| | | justify-content: center; |
| | | margin-right: 20rpx; |
| | | margin-bottom: 20rpx; |
| | | /* margin-right: 20rpx; |
| | | margin-bottom: 20rpx; */ |
| | | margin: 10rpx 10rpx 10rpx 0; |
| | | /* #ifdef H5 */ |
| | | cursor: pointer; |
| | | /* #endif */ |