img-upload.vue 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <script lang="ts" setup>
  2. import { ref } from "vue";
  3. import { type UploadUserFile, type UploadProps, ElMessage } from "element-plus";
  4. import { useUserStore } from "/@/store/modules/user";
  5. import { useResponseHandle } from "/@/hooks";
  6. import { httpImageUpload, baseUrl } from "/@/api/other";
  7. const emit = defineEmits(["change"]);
  8. const types = ["image/png", "image/jpg", "image/bmp", "image/jpeg"];
  9. const fileList = ref<UploadUserFile[]>([]);
  10. const imgs = ref<Array<string>>([]);
  11. const userStore = useUserStore();
  12. const responseHandle = useResponseHandle();
  13. const onBeforeReturnImageUpload: UploadProps["beforeUpload"] = ({
  14. type,
  15. size
  16. }) => {
  17. if (!types.includes(type)) {
  18. ElMessage.error("请上传jpg.png.bmp.jpeg类型图片");
  19. return false;
  20. }
  21. if (size / 1024 / 1024 > 1) {
  22. ElMessage.error("图片大小超过1M");
  23. return false;
  24. }
  25. };
  26. const handleRequeset: UploadProps["httpRequest"] = async ({ file }) => {
  27. const _formData = new FormData();
  28. _formData.append("img", file);
  29. _formData.append("token", userStore.token);
  30. const { message, code, data } = await httpImageUpload(_formData);
  31. responseHandle({
  32. message,
  33. code,
  34. handler: () => {
  35. imgs.value.push(baseUrl + "/" + data[0].url);
  36. emit("change", imgs.value.join(","));
  37. }
  38. });
  39. };
  40. const handleRemove: UploadProps["beforeRemove"] = uploadFile => {
  41. const delIndex = fileList.value.findIndex(
  42. ({ uid }) => uid === uploadFile.uid
  43. );
  44. imgs.value.splice(delIndex, 1);
  45. emit("change", imgs.value.join(","));
  46. return true;
  47. };
  48. </script>
  49. <template>
  50. <el-upload
  51. v-model:file-list="fileList"
  52. :before-upload="onBeforeReturnImageUpload"
  53. :http-request="handleRequeset"
  54. :before-remove="handleRemove"
  55. list-type="picture"
  56. >
  57. <el-button type="primary">上传图片</el-button>
  58. <template #tip>
  59. <div class="el-upload__tip">请上传jpg.png.bmp.jpeg类型图片</div>
  60. </template>
  61. </el-upload>
  62. </template>