feat(system): 优化文件上传功能并添加前端上传组件

- 修改后端文件上传接口,返回上传文件的URL
- 新增文件上传前的本地校验逻辑- 实现文件拖拽上传功能
- 添加两个新的前端上传组件:CuteFileUpload 和 CuteFileDragUpload
- 更新后端 MinioRepository 类,支持生成预签名 URL
This commit is contained in:
2025-07-17 22:48:37 +08:00
parent f11016b67a
commit dcb696a94a
8 changed files with 204 additions and 38 deletions
@@ -0,0 +1,69 @@
<template>
<el-upload
ref="upload"
drag
:limit="1"
:before-upload="beforeUpload"
:auto-upload="true"
:headers="headers"
:on-success="handleSuccess"
:on-error="handleError"
:action="ossUploadApi"
>
<i class="el-icon-upload" />
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<div slot="tip" class="el-upload__tip">只能上传不超过100MB的文件</div>
</el-upload>
</template>
<script>
import { Message } from 'element-ui'
import { mapGetters } from 'vuex'
import { getToken } from '@/utils/auth'
export default {
name: 'CuteFileUpload',
props: {
value: {
type: Object,
required: true,
default: null
}
},
data() {
return {
headers: { 'Authorization': getToken() }
}
},
computed: {
...mapGetters([
'baseApi',
'ossUploadApi'
])
},
methods: {
beforeUpload(file) {
let isLt2M = true
isLt2M = file.size / 1024 / 1024 < 100
if (!isLt2M) {
this.$message.error('上传文件大小不能超过 100MB')
return false
}
return isLt2M
},
// 监听上传失成功
handleSuccess(response, file, fileList) {
// Message.success('上传成功')
// this.$refs.upload.clearFiles()
console.error('response', response)
console.error('file', file)
console.error('fileList', fileList)
this.value.fileUrl = response
},
// 监听上传失败
handleError(e, file, fileList) {
const msg = JSON.parse(e.message)
Message.error(msg.message)
}
}
}
</script>
@@ -0,0 +1,67 @@
<template>
<el-upload
ref="upload"
:limit="1"
:before-upload="beforeUpload"
:auto-upload="true"
:headers="headers"
:on-success="handleSuccess"
:on-error="handleError"
:action="ossUploadApi"
>
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传不超过100MB的文件</div>
</el-upload>
</template>
<script>
import { Message } from 'element-ui'
import { mapGetters } from 'vuex'
import { getToken } from '@/utils/auth'
export default {
name: 'CuteFileUpload',
props: {
value: {
type: Object,
required: true,
default: null
}
},
data() {
return {
headers: { 'Authorization': getToken() }
}
},
computed: {
...mapGetters([
'baseApi',
'ossUploadApi'
])
},
methods: {
beforeUpload(file) {
let isLt2M = true
isLt2M = file.size / 1024 / 1024 < 100
if (!isLt2M) {
this.$message.error('上传文件大小不能超过 100MB')
return false
}
return isLt2M
},
// 监听上传失成功
handleSuccess(response, file, fileList) {
// Message.success('上传成功')
// this.$refs.upload.clearFiles()
console.error('response', response)
console.error('file', file)
console.error('fileList', fileList)
this.value.fileUrl = response
},
// 监听上传失败
handleError(e, file, fileList) {
const msg = JSON.parse(e.message)
Message.error(msg.message)
}
}
}
</script>
@@ -40,9 +40,6 @@
width="500px"
>
<el-form ref="form" :model="form" size="small" label-width="80px">
<el-form-item label="文件名">
<el-input v-model="form.name" style="width: 370px;" />
</el-form-item>
<!-- 上传文件 -->
<el-form-item v-if="crud.status.add" label="上传">
<el-upload
@@ -53,7 +50,7 @@
:headers="headers"
:on-success="handleSuccess"
:on-error="handleError"
:action="ossUploadApi + '?name=' + form.name"
:action="ossUploadApi"
>
<div class="my-upload"><i class="el-icon-upload" /> 添加文件</div>
<div slot="tip" class="el-upload__tip">可上传任意格式文件,且不超过100M</div>
@@ -106,7 +103,7 @@ import DateRangePicker from '@/components/DateRangePicker'
import Clipboard from 'clipboard'
import { Message } from 'element-ui'
const defaultForm = { id: null, name: '' }
const defaultForm = { id: null }
export default {
components: { pagination, crudOperation, rrOperation, DateRangePicker },
cruds() {
@@ -145,7 +142,6 @@ export default {
this.loading = false
this.$message.error('上传文件大小不能超过 100MB')
}
this.form.name = file.name
return isLt2M
},
handleSuccess(response, file, fileList) {