upload.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <template>
  2. <el-upload
  3. class="file-upload"
  4. ref="uploadRef"
  5. multiple
  6. :file-list="fileList"
  7. action=""
  8. :http-request="uploadFile"
  9. :on-change="changeFiles"
  10. :on-remove="removeFile"
  11. :auto-upload="false"
  12. >
  13. <el-button type="primary">选择附件</el-button>
  14. </el-upload>
  15. <p v-if="isTips">支持格式:.rar .zip .doc .docx .pdf ,单个文件不能超过20MB</p>
  16. </template>
  17. <script setup lang="ts">
  18. import { getToken } from '@/utils/auth';
  19. import type { UploadProps, UploadRawFile } from 'element-plus'
  20. import request from '@/utils/request';
  21. interface fileListType {
  22. resourceName: string,
  23. resourceUrl: string,
  24. id: string,
  25. name: string
  26. }
  27. const props = defineProps({
  28. isTips: {
  29. type: Boolean,
  30. default: true
  31. },
  32. resourceList: {
  33. type: Array<fileListType>
  34. },
  35. })
  36. const emits = defineEmits(['uploadDone', 'uploadStatus'])
  37. const resourceIdList = defineModel<(string | number)[]>()
  38. const token = getToken()
  39. const fileList = computed(() => {
  40. let list = props.resourceList || []
  41. resourceIdList.value = list.map(item => item.id)
  42. return list.map(item => {
  43. let obj = {
  44. name: item.resourceName,
  45. url: item.resourceUrl,
  46. id: item.id
  47. }
  48. return obj
  49. })
  50. })
  51. const uploadRef = ref()
  52. const timer = ref<number>()
  53. const files = ref<UploadRawFile[]>([])
  54. const changeFiles: UploadProps['onChange'] = (file) => {
  55. if(file.raw) {
  56. files.value.push(file.raw)
  57. }
  58. clearTimeout(timer.value)
  59. timer.value = setTimeout(() => {
  60. uploadFile()
  61. }, 500)
  62. }
  63. const uploadFile = () => {
  64. emits('uploadStatus', 'loading')
  65. let formData = new FormData()
  66. files.value.map(item => {
  67. formData.append('fileList', item)
  68. })
  69. request({
  70. url: '/sys-resource/add-list',
  71. method: 'post',
  72. data: formData,
  73. headers: {
  74. "Content-Type": "multipart/form-data",
  75. token
  76. }
  77. }).then(res => {
  78. if(res.success) {
  79. resourceIdList.value.push(...res.result)
  80. emits('uploadDone', res.result)
  81. ElMessage.success('附件上传成功')
  82. files.value = []
  83. emits('uploadStatus', 'done')
  84. }
  85. }).catch(() => {
  86. ElMessage.error('上传失败,请稍后再试')
  87. })
  88. }
  89. const removeFile = (uploadFile: fileListType) => {
  90. if(resourceIdList.value){
  91. resourceIdList.value.splice(resourceIdList.value.findIndex(item => item == uploadFile.id), 1)
  92. }
  93. }
  94. </script>
  95. <style>
  96. .file-upload{
  97. width: 100%;
  98. text-align: left;
  99. }
  100. </style>