1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- <template>
- <el-upload ref="upload" :action="action" :auto-upload="auto" v-bind="$attrs" :data="data" :before-upload="initOss" :on-success="handleSuccess">
- <template v-for="(index, name) in $slots" v-slot:[name]>
- <slot :name="name"></slot>
- </template>
- </el-upload>
- </template>
- <script setup lang="ts">
- import http from "/admin/support/http"
- import {ref} from "vue";
- import Message from "/admin/support/message";
- const props = defineProps({
- auto: {
- type: Boolean,
- default: true,
- },
- modelValue: {
- type: Boolean,
- default: false,
- require: true,
- },
- })
- const action = ref('')
- const data = ref({
- OSSAccessKeyId: '',
- policy: '',
- Signature: '',
- key: '',
- host: '',
- dir: '',
- expire: '',
- success_action_status: 200
- })
- const emits = defineEmits(['update:modelValue'])
- const initOss = async (file) => {
- if (file.size > 10 * 1024 * 1024) {
- Message.error('最大支持 10MB 文件')
- return
- }
- await http.get('upload/oss').then(r => {
- const {accessKeyId, bucket, dir, expire, host, policy, signature, url} = r.data.data
- action.value = host
- data.value.OSSAccessKeyId = accessKeyId
- data.value.policy = policy
- data.value.Signature = signature
- data.value.key = dir + file.name
- data.value.host = host
- data.value.dir = dir
- data.value.expire = expire
- })
- }
- const handleSuccess = (r) => {
- emits('update:modelValue', action.value + data.value.key)
- }
- </script>
|