上传文件名加密

This commit is contained in:
hongchao 2024-12-19 16:46:48 +08:00
parent af28fdfd86
commit 0511ebef27
4 changed files with 323 additions and 6 deletions

4
package-lock.json generated
View File

@ -18,7 +18,7 @@
"element-plus": "^2.4.3",
"file-saver": "^2.0.5",
"force": "^0.0.3",
"js-base64": "^3.7.5",
"js-base64": "^3.7.7",
"mitt": "^3.0.1",
"moment": "^2.29.4",
"nprogress": "^0.2.0",
@ -3150,7 +3150,7 @@
},
"node_modules/js-base64": {
"version": "3.7.7",
"resolved": "https://repo.huaweicloud.com/repository/npm/js-base64/-/js-base64-3.7.7.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/js-base64/-/js-base64-3.7.7.tgz",
"integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==",
"license": "BSD-3-Clause"
},

View File

@ -24,7 +24,7 @@
"element-plus": "^2.4.3",
"file-saver": "^2.0.5",
"force": "^0.0.3",
"js-base64": "^3.7.5",
"js-base64": "^3.7.7",
"mitt": "^3.0.1",
"moment": "^2.29.4",
"nprogress": "^0.2.0",

View File

@ -0,0 +1,316 @@
<template>
<div class="upload_ss_c">
<!--action="/api/abk/web/v1/resource/file" -->
<el-upload
:action="props.actionUrl"
:auto-upload="props.autoUpload"
:headers="headerInfo"
style="width: 100%"
:on-success="(response:any, file:any) => successUpload(response, file)"
:on-error="errorUpload"
:accept="props.acceptTypeList.join(',')"
:before-upload="beforeUpload"
:multiple="false"
:file-list="fileListNew"
:disabled="props.disabledFlag"
:on-change="changeFileFn"
:on-remove="(file:any, fileList:any) => removeFile(file, fileList)"
:on-preview="onPreview"
:on-progress="(event:any, file:any, fileList:any) => onProgressFn(event, file, fileList)"
:list-type="props.listType"
>
<!-- 上传的按钮 或者 icon 通过具名插槽的方式 -->
<div>
<slot name="default"></slot>
</div>
<slot name="textContent"></slot>
</el-upload>
<el-progress v-if="showProcessFlag && processFlag" :percentage="loadProcess"></el-progress>
<el-dialog center width="90%" destroy-on-close v-model="previewDialogVisible">
<el-image style="width: 100%; height: 50%" :src="previewDialogImageUrl" fit="cover" />
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import { ref, nextTick } from 'vue'
import { ElMessage } from 'element-plus'
import { Base64 } from 'js-base64' // Base64
// import { Base64 } from 'js-base64'
// const tmpUploadUrl = import.meta.env.VITE_API_URL + '/zlpt-file/file/cos/upload'
import { mainStore } from 'store/main'
const store = mainStore()
const headerInfo = reactive({
Authorization: store.token,
})
const fileListNew: any = ref([])
const emit = defineEmits(['onFileChange'])
const previewDialogVisible = ref(false)
const previewDialogImageUrl = ref('')
// console.log('tmpUploadUrl', tmpUploadUrl)
// const actionUrl = ref(tmpUploadUrl)
const props = defineProps({
fileListN: {
type: Array,
default: () => {
return []
},
},
actionUrl: {
//
type: String,
default: '',
},
width: {
//
type: String,
default: '100%',
},
height: {
//
type: String,
default: '100%',
},
justifyContent: {
//
type: String,
default: 'center',
},
autoUpload: {
//
type: Boolean,
default: false,
},
acceptTypeList: {
//
type: Array,
default: () => {
return ['.jpg', '.jpeg', '.png']
},
},
multiple: {
//
type: Boolean,
default: false,
},
maxLimit: {
//
type: Number || String,
default: 1,
},
minLimit: {
//
type: Number || String,
default: 1,
},
maxSize: {
// M
type: Number || String,
default: 10,
},
currentIndex: {
// M
type: Number,
default: 0,
},
disabledFlag: {
//
type: Boolean,
default: false,
},
fileList: {
//
type: Array,
default: () => {
return []
},
},
listType: {
type: String, //'text' | 'picture' | 'picture-card'
default: 'picture',
},
extraData: {}, // name
/*
{
name:'12321'
}
*/
dragFlag: {
type: Boolean,
default: true, // element
},
downLoadTypeList: {
//
type: Array,
default: () => {
return ['doc', 'docx', 'xlsx', 'xls', 'txt']
},
},
preveiwTypeList: {
//
type: Array,
default: () => {
return ['pdf', 'jpg', 'jpeg', 'png']
},
},
officePreviewFlag: {
//office线
type: Boolean,
default: false,
},
showProcessFlag: {
//
type: Boolean,
default: false,
},
scuccesCallback: {
type: Function,
default: () => {},
},
successResultCallBack: {
type: Function,
default: () => {},
},
})
// office
// https://view.officeapps.live.com/op/view.aspx?src=
// https://view.officeapps.live.com/op/view.aspx?src=
//
const officeOnlineAddress = 'https://view.officeapps.live.com/op/view.aspx?src='
const officeType = ['doc', 'docx', 'xlsx', 'xls']
let processFlag = ref(false) //
let loadProcess = ref(0) //
//
const encryptFileName = (fileName: string): string => {
const parts = fileName.split('.');
const name = parts.slice(0, -1).join('.');
const extension = parts[parts.length - 1];
//
const encryptedName = Base64.encode(name);
//
return `${encryptedName}.${extension}`;
}
//
const successUpload = (response: any, file: any) => {
console.log('successUpload', response, file)
if (response.code === 200) {
// props.fileList.push({
// url: response.data,
// name: file.name,
// })
// props.successResultCallBack(response)
const fileInfo = {
uid: file.uid,
}
Object.assign(fileInfo, response.data)
fileListNew.value.push(fileInfo)
emit('onFileChange', fileListNew.value, props.currentIndex)
// console.log(fileListNew.value, '-----------3333333333333')
} else {
ElMessage({
type: 'warning',
message: response.data,
})
}
}
const errorUpload = (res: any) => {
ElMessage({
type: 'warning',
message: '上传失败请重试!',
})
}
const beforeUpload = (file: any) => {
console.log('file', file)
console.log(props.minLimit, '个数---')
const { name = '', size } = file
if (size > props.maxSize * 1024 * 1000) {
ElMessage({
type: 'warning',
message: `文件大小不能超过${props.maxSize}M`,
})
return false
}
if (fileListNew.value.length + props.minLimit >= props.maxLimit) {
ElMessage({
type: 'warning',
message: `最多只能上传${props.maxLimit}个文件`,
})
return false
}
let names = name.split('.')
let currentName = names[names.length - 1]
console.log('acceptTypeListacceptTypeList', props.acceptTypeList, currentName)
console.log('name.split().pop()')
if (!props.acceptTypeList.includes('.' + currentName)) {
ElMessage({
type: 'warning',
message: `文件格式仅支持${props.acceptTypeList.join(',')}`,
})
return false
}
console.log('beforeUpload',file.name)
//
const fileJm = encryptFileName(file.name)
console.log('beforeUpload2',fileJm)
// File 使
const newFile = new File([file], fileJm, { type: file.type });
console.log('beforeUpload3',newFile.name)
return newFile
}
const handleExceed = (files: any, fileList: any) => {
ElMessage({
type: 'warning',
message: `最多只能上传${props.maxLimit}个文件`,
})
}
//
const removeFile = (file: any, data: any) => {
fileListNew.value = fileListNew.value.filter((e: any) => e.uid != file.uid)
emit('onFileChange', fileListNew.value, props.currentIndex)
}
//
const onPreview = (data: any) => {
const { url: fileUrl } = data.response.data
// previewDialogImageUrl.value = fileUrl
window.open(fileUrl)
// previewDialogVisible.value = true
}
const onProgressFn = (event: any, file: any, fileList: any) => {
processFlag.value = true
loadProcess.value = event.percent.toFixed(2)
if (loadProcess.value >= 100) {
loadProcess.value = 100
nextTick(() => {
processFlag.value = false
})
}
}
const changeFileFn = (ev: any) => {
props.scuccesCallback(ev)
}
</script>
<style lang="scss" scoped>
:deep(.el-upload) {
width: v-bind('props.width') !important;
height: v-bind('props.height') !important;
justify-content: v-bind('props.justifyContent');
}
:deep(.el-upload-list__item) {
width: v-bind('props.width') !important;
height: v-bind('props.height') !important;
}
</style>
<style></style>

View File

@ -275,7 +275,7 @@
<el-col :span="24">
<el-form-item label="附件" prop="fileInfoList">
<div style="flex: 1">
<UploadComponentNew
<UploadComponentNewTwo
:maxSize="10"
:max-limit="1"
width="100%"
@ -298,7 +298,7 @@
>上传文件</el-button
>
</template>
</UploadComponentNew>
</UploadComponentNewTwo>
</div>
</el-form-item>
</el-col>
@ -324,7 +324,7 @@ import EditorModel from 'components/EditorModel/index.vue'
import TableComponent from 'components/TableComponent/index.vue'
import FormComponent from 'components/FormComponent/index.vue'
import PagingComponent from 'components/PagingComponent/index.vue'
import UploadComponentNew from 'components/uploadComponentNew/index.vue'
import UploadComponentNewTwo from 'components/uploadComponentNewTwo/index.vue'
import TitleTip from 'components/TitleTip/index.vue'
import uploadComponent from 'components/uploadComponent/index.vue'
import previewImg from './previewImg/index.vue'
@ -513,6 +513,7 @@ const onDialogClose_2 = () => {}
const onFileChange = (fileList: any) => {
addAndEditForm.value.fileInfoTempList = []
const fileListTemp = fileList.map((e: any) => {
console.log('111111', e)
return {
fileName: e.name,
fileUrl: e.url,