当前位置:   article > 正文

vue3+ts+vite+elementPlus实现文件上传导入excle给后端,并且清空上传文件后的列表,以及formData变成[object FormData]的解决方法_vue上传文件到后端

vue上传文件到后端

一、文件上传

1.首先我们文件上传的方法用到的是multipart/form-data,它是基于post方法来传递数据的,需求是实现类似与这样的:来一个弹框实现两个excel的文件导入

 2.用vue的axios发起post请求:

 3.引用elementPlus组件中的upload,注意:upload有默认的上传文件方式,并且是数组类型

  1. <el-dialog v-model="dialogFormVisible" title="数据导入" id="input">
  2. <el-form :model="form">
  3. <el-form-item label="输入日期" :label-width="formLabelWidth">
  4. <el-input v-model="form.time" autocomplete="off" placeholder="XXXX年X月X日"/>
  5. </el-form-item>
  6. </el-form>
  7. <el-form-item label="数据" :label-width="formLabelWidth">
  8. <el-upload
  9. ref="uploadRefs"
  10. :limit="1"
  11. :auto-upload="false"
  12. action=""
  13. accept=".xlsx, .xls"
  14. :on-exceed="exceedFile"
  15. :on-error="handleError"
  16. :on-success="handleSuccess"
  17. :before-upload="beforeUPload"
  18. :show-file-list="true"
  19. v-model:file-list="form.fileList"
  20. >
  21. <el-button type="primary">选择文件</el-button>
  22. </el-upload>
  23. </el-form-item>
  24. <el-form-item label="数据" :label-width="formLabelWidth">
  25. <el-upload
  26. ref="uploadRef"
  27. :limit="1"
  28. :auto-upload="false"
  29. action=""
  30. accept=".xlsx, .xls"
  31. :on-exceed="exceedFile"
  32. :on-error="handleError"
  33. :on-success="handleSuccess"
  34. :before-upload="beforeUPload"
  35. :show-file-list="true"
  36. v-model:file-list="form.files"
  37. >
  38. <el-button type="primary">选择文件</el-button>
  39. </el-upload>
  40. </el-form-item>
  41. <template #footer>
  42. <span class="dialog-footer">
  43. <el-button @click="dialogFormVisible = false">取消</el-button>
  44. <el-button type="primary" @click="uploadExcel" @dialogFormVisible="false">
  45. 确认导入
  46. </el-button>
  47. </span>
  48. </template>
  49. </el-dialog>

4.在ts中先导入以下东西:

  1. import {ref, reactive} from 'vue'
  2. import {ElMessage, ElTable,ElUpload, ElButton,ElMessageBox} from 'element-plus'
  3. import type {UploadInstance} from 'element-plus'
  4. import {dataInput} from '@/api/emission';

 5.在from表单中接收上传文件的数组:

  1. const form = reactive<any>({
  2. fileList: [],
  3. files: []
  4. })

 6.之前看了一些上传文件的博客,好像都有const file = new FormData(),于是我也这样写了:

 就发现了上传文件错误:formData变成[object FormData]

FormData 它的基本用法:

FormData 是一个构造函数,new FormData() 即可得到 FormData 对象:

const fd = new FormData() // 创建一个空白的 FormData 对象,里面没有包含任何数据。

调用 FormData 对象的 append(键, 值) 方法,可以向空白的 FormData 中追加键值对数据

但是事实上element Plus里的upload组件里面已经有写好的文件上传方法

并不需要我们再次将获取到的文件变为二进制,然后上传

7.于是我就改成了以下代码:

 8.成功将文件转换为binary(二进制)并上传给后端!

 9.ts文件上传的完整代码

  1. // 数据导入
  2. const beforeUPload = (file: any) => {
  3. const isExcel =
  4. file.type === 'application/vnd.ms-excel' ||
  5. file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
  6. if (!isExcel)
  7. ElMessageBox({
  8. title: '温馨提示',
  9. message: '上传文件只能是 xls / xlsx 格式!',
  10. type: 'warning',
  11. });
  12. return isExcel;
  13. };
  14. // 文件数超出提示
  15. const exceedFile = () => {
  16. ElMessage.warning('最多只能上传一个文件!');
  17. };
  18. // 上传错误提示
  19. const handleError = () => {
  20. ElMessage.error('导入数据失败,请您重新上传!');
  21. };
  22. //上传成功提示
  23. const handleSuccess = () => {
  24. ElMessage.success('导入数据成功!');
  25. };
  26. // 文件上传
  27. const uploadExcel = async (file :any) =>{
  28. if(form.time=='' || form.fileList[0]== '' || form.files[0] == '')
  29. return ElMessage.error('日期或者文件不能为空!')
  30. let gasDataFile = form.fileList[0].raw
  31. let electricityDataFile =form.files[0].raw
  32. await dataInput({time : form.time,gasDataFile,electricityDataFile}).then((res:any) =>{
  33. if(res.message=='成功'){
  34. ElMessage.success('导入成功!');
  35. dialogFormVisible.value=false
  36. }else{
  37. ElMessage.error('导入失败!')
  38. }
  39. })
  40. getList()
  41. if(gasDataFile!== '')
  42. {
  43. form.time=''
  44. uploadRefs.value?.clearFiles()
  45. }
  46. if(electricityDataFile!== '')
  47. {
  48. uploadRef.value?.clearFiles()
  49. }
  50. }

二、清空文件上传的列表

post请求成功后,清空文件上传的列表用clearFiles():

(1)因为我这里上传了两个文件,但清空方法都一样,所以以下我只举列了一个文件列表清空的方法:

先写ref="uploadRef(名字自取,但是不能写upload,它应该是关键字)",

 ref="uploadRef"

 (2)引用并调用外部方法:

  1. import type {UploadInstance} from 'element-plus'
  2. const uploadRefs = ref<UploadInstance>()

 

 (3)使用清空文件上传的clearFiles():

uploadRef.value?.clearFiles()

将会成功清除!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/171243
推荐阅读
相关标签
  

闽ICP备14008679号