index.vue
3.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<template>
<n-upload
v-model:file-list="fileList"
:show-file-list="true"
:customRequest="customRequest"
:onBeforeUpload="beforeUploadHandle"
:onRemove="remove"
>
<n-upload-dragger>
<img v-if="uploadImageUrl" class="upload-show" :src="uploadImageUrl" alt="上传的图片" />
<div class="upload-img" v-show="!uploadImageUrl">
<img src="@/assets/images/canvas/noImage.png" />
<n-text class="upload-desc" depth="3">
上传文件需小于 {{ uploadSizeFormat.size }}M ,格式为 {{ uploadSizeFormat.format }} 的文件
</n-text>
</div>
</n-upload-dragger>
</n-upload>
</template>
<script lang="ts" setup name="TKUpload">
import { ref, PropType, nextTick } from 'vue'
import type { UploadCustomRequestOptions, UploadFileInfo } from 'naive-ui'
import { fetchRouteParamsLocation } from '@/utils'
import { uploadFile } from '@/api/external/contentSave/content'
import { FileTypeEnum } from '@/enums/external/fileTypeEnum'
interface uploadSizeFormatIF {
size: number
format: string
}
const props = defineProps({
uploadIndex: Number,
uploadImageUrl: {
type: String as PropType<string>,
default: ''
},
uploadSizeFormat: {
type: Object as PropType<uploadSizeFormatIF>,
default: () => ({
size: 5,
format: 'png/jpg/jpeg/gif'
})
}
})
const emit = defineEmits(['sendFile', 'removeFile'])
const fileList = ref<UploadFileInfo[]>()
// 自定义上传操作
const customRequest = (options: UploadCustomRequestOptions) => {
const { file } = options
nextTick(async () => {
if (file.file) {
const newNameFile = new File([file.file], `${fetchRouteParamsLocation()}_index_upload.png`, {
type: file.file.type
})
let uploadParams = new FormData()
uploadParams.append('file', newNameFile)
const uploadRes = await uploadFile(uploadParams)
if (!uploadRes) return
emit('sendFile', uploadRes?.fileStaticUri, props.uploadIndex)
window['$message'].success('上传文件成功!')
} else {
window['$message'].error('上传文件失败,请稍后重试!')
}
})
}
// 文件上传前置处理
const beforeUploadHandle = (file: UploadFileInfo) => {
fileList.value = []
const type = file.file?.type
const size = file.file?.size as number
const typeSuffix = type?.split('/')?.at(-1)?.toUpperCase() as keyof typeof FileTypeEnum
if (size > 1024 * 1024 * props.uploadSizeFormat.size) {
window['$message'].warning(`文件超出 ${props.uploadSizeFormat.size}M限制,请重新上传!`)
return false
}
if (!FileTypeEnum[typeSuffix]) {
window['$message'].warning('文件格式不符合,请重新上传!')
return false
}
return true
}
//单个点击删除
const remove = () => {
fileList.value = []
emit('removeFile', true, props.uploadIndex)
}
</script>
<style lang="scss" scoped>
$uploadHeight: 193px;
@include deep() {
.n-card__content {
padding: 0;
overflow: hidden;
}
.n-upload-dragger {
padding: 5px;
}
}
.upload-show {
width: -webkit-fill-available;
height: $uploadHeight;
border-radius: 5px;
}
.upload-img {
display: flex;
flex-direction: column;
align-items: center;
img {
height: 150px;
}
.upload-desc {
padding: 10px 0;
}
}
</style>