file.vue 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. <template>
  2. <input type="file" ref="fileInput" :accept="accept" style="display: none;" @change="handleUploadFile"/>
  3. </template>
  4. <script setup>
  5. defineOptions({ name: 'upload-file'})
  6. import { ref } from 'vue'
  7. import Snackbar from '@/plugins/snackbar'
  8. import { useI18n } from '@/hooks/web/useI18n'
  9. import { uploadFile } from '@/api/common'
  10. const emits = defineEmits(['success'])
  11. defineProps({
  12. accept: {
  13. type: String,
  14. default: '.pdf, .doc, .docx'
  15. }
  16. })
  17. const { t } = useI18n()
  18. const clicked = ref(false)
  19. const fileInput = ref()
  20. const trigger = () => {
  21. if (clicked.value) return
  22. clicked.value = true
  23. fileInput.value.click()
  24. clicked.value = false
  25. }
  26. const handleUploadFile = async (e) => {
  27. if (!e.target.files.length) return
  28. const file = e.target.files[0]
  29. const size = file.size
  30. if (size / (1024*1024) > 10) {
  31. Snackbar.warning(t('common.fileSizeExceed'))
  32. return
  33. }
  34. const arr = file.name.split('.')
  35. const formData = new FormData()
  36. formData.append('file', file)
  37. const { data } = await uploadFile(formData)
  38. if (!data) return
  39. emits('success', data, arr[0])
  40. }
  41. defineExpose({
  42. trigger
  43. })
  44. </script>
  45. <style scoped lang="scss">
  46. </style>