common.vue 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <template>
  2. <div>
  3. <el-upload
  4. :action="`${path}/fileUploadAndDownload/upload`"
  5. :before-upload="checkFile"
  6. :on-error="uploadError"
  7. :on-success="uploadSuccess"
  8. :show-file-list="false"
  9. class="upload-btn"
  10. >
  11. <el-button v-preReClick type="primary">普通上传</el-button>
  12. </el-upload>
  13. </div>
  14. </template>
  15. <script setup>
  16. import { ref, defineEmits } from 'vue'
  17. import { ElMessage } from 'element-plus'
  18. import { useUserStore } from '@/pinia/modules/user'
  19. import { isVideoMime, isImageMime } from '@/utils/image'
  20. defineOptions({
  21. name: 'UploadCommon'
  22. })
  23. const emit = defineEmits(['on-success'])
  24. const path = ref(import.meta.env.VITE_BASE_API)
  25. const userStore = useUserStore()
  26. const fullscreenLoading = ref(false)
  27. const checkFile = file => {
  28. fullscreenLoading.value = true
  29. const isLt500K = file.size / 1024 / 1024 < 0.5 // 500K, @todo 应支持在项目中设置
  30. const isLt5M = file.size / 1024 / 1024 < 5 // 5MB, @todo 应支持项目中设置
  31. const isVideo = isVideoMime(file.type)
  32. const isImage = isImageMime(file.type)
  33. let pass = true
  34. if (!isVideo && !isImage) {
  35. ElMessage.error(
  36. '上传图片只能是 jpg,png,svg,webp 格式, 上传视频只能是 mp4,webm 格式!'
  37. )
  38. fullscreenLoading.value = false
  39. pass = false
  40. }
  41. if (!isLt5M && isVideo) {
  42. ElMessage.error('上传视频大小不能超过 5MB')
  43. fullscreenLoading.value = false
  44. pass = false
  45. }
  46. if (!isLt500K && isImage) {
  47. ElMessage.error('未压缩的上传图片大小不能超过 500KB,请使用压缩上传')
  48. fullscreenLoading.value = false
  49. pass = false
  50. }
  51. console.log('upload file check result: ', pass)
  52. return pass
  53. }
  54. const uploadSuccess = res => {
  55. const { data } = res
  56. if (data.file) {
  57. emit('on-success', data.file.url)
  58. }
  59. }
  60. const uploadError = () => {
  61. ElMessage({
  62. type: 'error',
  63. message: '上传失败'
  64. })
  65. fullscreenLoading.value = false
  66. }
  67. </script>