|
- <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">
- <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"><l-icon type="text" /></view>
-
- <view v-if="!readonly" @click.stop="delFile(index)" 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>
-
- <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', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'image'].includes(typeString)
- return true;
- },
-
- isDocFile(type) {
- const typeString = (type || '').toLowerCase()
- return ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf'].includes(typeString)
- },
-
- delFile(index) {
- const newList = JSON.parse(JSON.stringify(this.value))
- newList.splice(index, 1)
- this.$emit('input', newList)
- this.$emit('change')
- this.$emit('del')
- },
-
- 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')
- }
- })
- // #endif
- },
-
- async fileClick(index) {
- const { path, type, uid, size = 0 } = this.value[index]
- 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;
- }
- </style>
|