csi-financial-front/src/components/Upload/indexMultiple.vue

298 lines
6.9 KiB
Vue
Raw Normal View History

2026-03-23 15:21:53 +08:00
<template>
<div style="width: 100%">
<!-- accept=".pdf" -->
<el-upload
ref="uploadView"
class="avatar-uploader"
style="width: 100%"
:data="uploadData"
v-loading="loading"
:http-request="uploadAction"
:headers="uploadHeader"
drag
:limit="limit"
:accept="'.pdf,.docx'"
2026-03-23 15:21:53 +08:00
v-model:file-list="fileList"
:on-success="handleAvatarSuccess"
:before-upload="onBeforeUpload"
:on-exceed="handleExceed"
:on-progress="onProgress"
:on-change="onChange"
:show-file-list="false"
>
<div class="el-upload__text">
<img :src="iconFile" />
<div class="upload_text_one">将文件拖拽至此处</div>
<div></div>
<ZButton btn-width="112px" btn-height="32px">
<img :src="iconFileWhite" style="width: 12px; height: 13px; margin-right: 5px" />
<text style="font-family: 'Alip-Regular'">选择文件</text>
</ZButton>
</div>
</el-upload>
</div>
</template>
<script setup lang="ts" name="upload">
import { ref, onBeforeMount, watch } from 'vue';
import { ElMessage } from 'element-plus';
import { Session } from '/@/utils/storage';
import ZButton from '/@/components/ZButton/index.vue';
import iconFile from '/@/assets/images/icon_file_big.png';
import iconFileWhite from '/@/assets/images/icon_file.png';
import { getUploadUrl, doUploadErrorLog, getWordFlag } from '/@/api/api';
import { uuid } from 'vue-uuid';
// import { getToken } from '@/utils/auth';
import ObsClient from 'esdk-obs-browserjs/src/obs';
import axios from 'axios';
import SparkMD5 from 'spark-md5';
const fileList = ref([]);
// const limit = ref(Session.get('roleName') == 'Director' || Session.get('roleName') == 'subCenter' || Session.get('roleName') == 'operate' ? 60 : 1);
const limit = ref(1);
const showView = ref(true);
const uploadUrl = ref(import.meta.env.VITE_API_URL + '/report/upload');
const props = defineProps({
model: {
type: Object,
},
fileListEx: {
type: Array,
},
});
const emit = defineEmits(['handleAvatarSuccess', 'onProgress', 'onChange', 'onFileChoose']);
watch(
() => props.fileListEx,
(val) => {
if (val && val.length > 0) {
fileList.value = val;
}
}
);
watch(
() => fileList.value,
(val) => {
if (val.length > 0) {
emit('onFileChoose', val);
}
}
);
const uploadData = ref({});
const uploadHeader = ref({
2026-03-23 15:29:11 +08:00
'auth-token': `${Session.get('token')}`,
2026-03-23 15:21:53 +08:00
phone: `${Session.get('userData').phone}`,
});
const loading = ref(false);
function uploadAction(param) {
console.log('🚀 ~ uploadAction ~ param:', param);
loading.value = true;
getUploadUrl({
fileName: param.file.name,
})
.then((res1) => {
loading.value = false;
if (res1.code == 200) {
let rData = res1;
var reopt = {
method: 'PUT',
url: res1.data.url,
withCredentials: false,
headers: {
'Content-Type': 'application/octet-stream',
// Host: 'financial-report-test.obs.cn-east-3.myhuaweicloud.com:443',
},
validateStatus: function (status) {
return status >= 200;
},
timeout: 600000,
maxRedirects: 0,
responseType: 'text',
data: param.file,
};
loading.value = true;
axios
.request(reopt)
.then(function (response) {
console.log('🚀 ~ response:', response);
loading.value = false;
if (response.status < 300) {
emit('onProgress', 100);
emit('handleAvatarSuccess', {
fileName: param.file.name,
fileMd5: fileMd5.value,
title: res1.data.title,
filePath: res1.data.filePath,
status: 'success',
});
} else {
ElMessage.error('上传失败');
loading.value = false;
doUploadErrorLog({
errorMsg: JSON.stringify(response),
});
uploadView.value.clearFiles();
emit('onProgress', 0);
emit('handleAvatarSuccess', {
fileName: param.file.name,
fileMd5: fileMd5.value,
title: res1.data.title,
filePath: res1.data.filePath,
status: 'fail',
});
}
// console.log(response.data);
// console.log('\n');
})
.catch(function (err) {
doUploadErrorLog({
errorMsg: JSON.stringify(err),
});
ElMessage.error('上传失败');
console.log('Creating object using temporary signature failed!');
console.log(err);
console.log('\n');
loading.value = false;
emit('onProgress', 0);
emit('handleAvatarSuccess', {
fileName: param.file.name,
fileMd5: fileMd5.value,
title: res1.data.title,
filePath: res1.data.filePath,
status: 'fail',
});
});
} else {
loading.value = false;
uploadView.value.clearFiles();
}
})
.catch((e) => {
loading.value = false;
uploadView.value.clearFiles();
});
}
function handleExceed() {
//提示最多只能
ElMessage.error('最多上传' + limit.value + '个文件!');
}
async function onBeforeUpload(res) {
console.log('🚀 ~ onBeforeUpload ~ res:', res);
let suffixName = res.name.substring(res.name.lastIndexOf('.') + 1);
// let canGo = true;
let canGo = false;
if (suffixName == 'pdf' || suffixName == 'PDF' || suffixName == 'docx') {
canGo = true;
} else {
canGo = false;
ElMessage.error('请上传PDF或docx文件');
}
2026-03-23 15:29:11 +08:00
let { code, data } = await getWordFlag({});
if (code == 200) {
if (data == 0 && suffixName == 'docx') {
canGo = false;
ElMessage.error('尚未开通上传word文件权限请联系中证报经营人员开通权限');
}
}
2026-03-23 15:21:53 +08:00
return canGo;
}
function isFileWithExtension(filename, extension) {
const fileExtension = filename.split('.').pop();
return fileExtension === extension;
}
const fileMd5 = ref();
function onChange(res) {
emit('onChange', res.name);
let fileReader = new FileReader();
let Spark = new SparkMD5.ArrayBuffer();
fileReader.readAsArrayBuffer(res.raw);
fileReader.onload = function (e) {
Spark.append(e.target.result);
let md5 = Spark.end();
console.log(md5);
fileMd5.value = md5;
};
if (res.name) {
showView.value = false;
} else {
showView.value = true;
}
}
function onProgress(res) {
emit('onProgress', res.percent);
}
function handleAvatarSuccess(res: any) {
if (res.code == 200) {
emit('handleAvatarSuccess', res.data);
} else {
ElMessage.error(res.msg);
}
}
const uploadView = ref(null);
function clearFile() {
uploadView.value.clearFiles();
}
const wordFlag = ref(false);
onBeforeMount(async () => {
let { code, data } = await getWordFlag({});
if (code == 200) {
if (data == 1) {
wordFlag.value = true;
}
}
});
defineExpose({
clearFile,
});
</script>
<style scoped lang="scss">
:deep(.el-upload-dragger) {
border: 1px solid #f0f2f5;
}
.el-upload__text {
display: flex;
flex-direction: column;
text-align: center;
justify-content: center;
align-items: center;
// font-weight: bold;
img {
width: 48px;
height: 48px;
}
.upload_text_one {
color: #19213d;
text-align: center;
font-size: 14px;
font-style: normal;
font-weight: bold;
line-height: 18.2px;
margin-top: 10px;
}
}
</style>