|
- <template>
- <view>
- <view class="cu-form-group" style="border-bottom: none; padding-bottom: 0;">
- <view class="title">
- <text v-if="required" class="lr-required">*</text>
- {{ title || '' }}
- </view>
- </view>
-
- <view class="cu-form-group" style="border-top: none;">
- <view class="grid col-4 grid-square flex-sub">
- <view v-for="(file, index) in value" :key="index" class="bg-img" style="position: relative;">
- <view v-if="file.noUpdated" class="mask"></view>
- <image
- v-if="isImgFile(file.type)"
- @click="fileClick(index)"
- :src="file.path?file.path:file"
- :webp="file.type === 'webp'"
- mode="aspectFill"
- ></image>
- <view v-else-if="isDocFile(file.type)" @click="fileClick(index)" class="file-icon solids">
- <l-icon type="text" />
- </view>
- <view v-else class="file-icon solids" @click="fileClick(index)"><l-icon type="text" /></view>
-
- <view v-if="!readonly" @click.stop="delFile(index,file.uid)" class="cu-tag bg-red" style="height: 24px; width: 24px;">
- <l-icon type="close" color="white" style="width: 18px; height: 24px; font-size: 24px;" />
- </view>
- <view class="fileName">
- <text>{{file.name}}</text>
- </view>
- </view>
-
- <view v-if="!readonly && value.length < Number(number)" @click="chooseFile" class="solids">
- <l-icon type="file" />
- </view>
- </view>
- </view>
- </view>
- </template>
-
- <script>
- export default {
- name: 'l-upload-file',
-
- props: {
- number: { default: 1 },
- readonly: {},
- value: { default: () => [] },
- title: {},
- required: {}
- },
-
- methods: {
- getFileExt(path) {
- return /\.(\w{2,5})$/.exec(path)[1] || null
- },
-
- isImgFile(type) {
- const typeString = (type || '').toLowerCase()
- return ['jpg','image/jpg','jpeg','image/jpeg', 'png', 'image/png','gif', 'image/gif','bmp', 'image/bmp','webp', 'image/webp','image'].includes(typeString)
- },
-
- isDocFile(type) {
- const typeString = (type || '').toLowerCase()
- return ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf'].includes(typeString)
- },
-
- async delFile(index,fileId) {
- if (!(await this.CONFIRM('删除文件', '确定要删除该文件吗?', true))) {
- return
- }
- const newList = JSON.parse(JSON.stringify(this.value))
- newList.splice(index, 1)
- this.$emit('input', newList)
- this.$emit('change')
- this.$emit('del')
- //物理删除
- this.DELETE_FILE(fileId);
- },
-
- chooseFile() {
- // #ifdef MP-DINGTALK
- // dd.chooseImage({
- // count: Number(this.number),
- // success: ({ filePaths }) => {
- // if (filePaths) {
- // const newList = JSON.parse(JSON.stringify(this.value || [])).concat(
- // filePaths.map(t => ({ path: t, type: this.getFileExt(t) }))
- // )
- // this.$emit('input', newList)
- // this.$emit('change', newList)
- // this.$emit('add')
- // }
- // }
- // })
- // #endif
-
- // #ifndef MP-DINGTALK
- // uni.chooseFile({
- // count: Number(this.number),
- // sizeType: ['original', 'compressed'],
- // sourceType: ['album', 'camera'],
- // success: ({ tempFilePaths }) => {
- // const newList = JSON.parse(JSON.stringify(this.value || [])).concat(
- // tempFilePaths//.map(t => ({ path: t, type: this.getFileExt(t) }))
- // )
- // this.$emit('input', newList)
- // this.$emit('change', newList)
- // this.$emit('add')
- // }
- // })
-
- uni.chooseFile({
- count: Number(this.number),
- sizeType: ['original', 'compressed'],
- sourceType: ['album', 'camera'],
- success: ({ tempFilePaths,tempFiles }) => {
- const newList = JSON.parse(JSON.stringify(this.value || [])).concat(
- // tempFilePaths//.map(t => ({ path: t, type: this.getFileExt(t) }))
- tempFilePaths.map((t,i) => ({ path: t, type: tempFiles[i].type, size:tempFiles[i].size, name:tempFiles[i].name, noUpdated:true} ))
- )
- this.$emit('input', newList)
- this.$emit('change', newList)
- this.$emit('add')
- }
- })
- // #endif
- },
-
- async fileClick(index) {
- // if(typeof this.value[index] == "string"){
- // uni.previewImage({ urls: this.value.filter(item=>typeof this.value[index] == "string"), current: this.value[index] })
- // return
- // }
- const { path, type, uid, size = 0 } = this.value[index]
- if (this.isImgFile(type)) {
- uni.previewImage({ urls: [path], current: path })
- }else{
- uni.openDocument({ filePath: path, fileType: type })
- }
- // if (this.isImgFile(type)) {
- // uni.previewImage({ urls: [path], current: path })
- // } else if (this.isDocFile(type)) {
- // // #ifndef H5 || MP-DINGTALK
- // if (size >= 50 * 1024 * 1024) {
- // this.TOAST('小程序端无法下载超过50MB的文件,此文件大小为${size}KB,超过限制')
- // return
- // }
- // // #endif
-
- // // #ifndef MP-DINGTALK
- // const tempFilePath = await this.HTTP_DOWNLOAD(uid)
- // uni.openDocument({ filePath: tempFilePath, fileType: type })
- // // #endif
-
- // // #ifdef MP-DINGTALK
- // this.TOAST('钉钉小程序只支持查看图片文件')
- // // #endif
- // } else {
- // // #ifndef MP-DINGTALK
- // this.TOAST('小程序端只支持打开图片和文档(word、pdf等)文件')
- // // #endif
-
- // // #ifdef MP-DINGTALK
- // this.TOAST('钉钉小程序只支持查看图片文件')
- // // #endif
-
- // // #ifdef APP-VUE
- // const tempFilePath = await this.HTTP_DOWNLOAD(uid)
- // uni.openDocument({ filePath: tempFilePath, fileType: type })
- // // #endif
-
- // // #ifdef H5
- // await this.HTTP_DOWNLOAD(uid)
- // // #endif
- // }
- }
- }
- }
- </script>
-
- <style lang="less" scoped>
- .file-icon {
- line-height: 100%;
- position: static;
- }
- .fileName{
- padding: 2px 2px;
- margin-bottom: 2px;
- text-align: center;
- position: absolute;
- bottom: 0px;
- width: 100%;
- background: rgba(0,0,0,0.2);
- color: #fff;
- font-size: 12px;
-
- text-overflow: ellipsis;
- overflow: hidden;
- white-space: nowrap;
- }
- .mask{
- position: absolute;
- top: 0;left: 0;
- width: 100%;
- height: 100%;
- // background: rgba(255,252,153,0.2);
- background: rgba(0,0,0,0.7);
- z-index: 100;
- pointer-events: none;
- }
- </style>
|