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

一、文件上传

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

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

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

<el-dialog v-model="dialogFormVisible" title="数据导入" id="input">
      <el-form :model="form">
        <el-form-item label="输入日期" :label-width="formLabelWidth">
          <el-input v-model="form.time" autocomplete="off"  placeholder="XXXX年X月X日"/>
        </el-form-item>
      </el-form>
      <el-form-item label="数据" :label-width="formLabelWidth">
        <el-upload
          ref="uploadRefs"
          :limit="1"
          :auto-upload="false"
          action=""
          accept=".xlsx, .xls"
          :on-exceed="exceedFile"
          :on-error="handleError"
          :on-success="handleSuccess"
          :before-upload="beforeUPload"
          :show-file-list="true"
          v-model:file-list="form.fileList"
        >
        <el-button type="primary">选择文件</el-button>
        </el-upload>
      </el-form-item>
      <el-form-item label="数据" :label-width="formLabelWidth">
        <el-upload
          ref="uploadRef"
          :limit="1"
          :auto-upload="false"
          action=""
          accept=".xlsx, .xls"
          :on-exceed="exceedFile"
          :on-error="handleError"
          :on-success="handleSuccess"
          :before-upload="beforeUPload"
          :show-file-list="true"
          v-model:file-list="form.files"
        >
        <el-button type="primary">选择文件</el-button>
        </el-upload>
      </el-form-item>
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="dialogFormVisible = false">取消</el-button>
          <el-button type="primary" @click="uploadExcel" @dialogFormVisible="false">
            确认导入
          </el-button>
        </span>
      </template>
      </el-dialog>

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

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

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

const form = reactive<any>({
  fileList: [],
  files: []
})

 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文件上传的完整代码

// 数据导入
const beforeUPload = (file: any) => {
	const isExcel =
		file.type === 'application/vnd.ms-excel' ||
		file.type ===	'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
	if (!isExcel)
		ElMessageBox({
			title: '温馨提示',
			message: '上传文件只能是 xls / xlsx 格式!',
			type: 'warning',
		});
	return isExcel;
};
// 文件数超出提示
const exceedFile = () => {
	ElMessage.warning('最多只能上传一个文件!');
};
// 上传错误提示
const handleError = () => {
	ElMessage.error('导入数据失败,请您重新上传!');
}; 
//上传成功提示
const handleSuccess = () => {
	ElMessage.success('导入数据成功!');
};
// 文件上传
const uploadExcel = async (file :any) =>{
if(form.time=='' || form.fileList[0]== '' || form.files[0] == '')
return ElMessage.error('日期或者文件不能为空!')
let gasDataFile = form.fileList[0].raw
let electricityDataFile =form.files[0].raw

 await dataInput({time : form.time,gasDataFile,electricityDataFile}).then((res:any) =>{
 if(res.message=='成功'){
    ElMessage.success('导入成功!');
    dialogFormVisible.value=false
 }else{
    ElMessage.error('导入失败!')
 }
})
getList()
if(gasDataFile!== '')
{
  form.time=''
  uploadRefs.value?.clearFiles()
}
if(electricityDataFile!== '')
{
  uploadRef.value?.clearFiles()
}
}

二、清空文件上传的列表

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

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

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

 ref="uploadRef"

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

import type {UploadInstance} from 'element-plus'

const uploadRefs = ref<UploadInstance>()

 

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

uploadRef.value?.clearFiles()

将会成功清除!

  • 13
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
对于vue-element-admin后端改造,你可以按照以下步骤进行操作: 1. 首先,你需要在服务器上使用Node.js启动vue-element-admin,默认是9258端口。这可以通过在命令行中进入vue-element-admin项目目录,然后运行`npm run dev`命令来实现。 2. 接下来,你需要使用Python的Flask框架来启动后端服务,默认是5000端口。你可以创建一个Flask应用,并在其中定义后端的API接口。 3. 修改vue-element-admin中的代码,将其后端交互功能指向Flask提供的服务。你可以在vue-element-admin项目中的`src/api`目录下找到与后端交互的文件,例如`user.js`。在这些文件中,你可以修改API请求的URL,将其指向Flask后端的对应接口。 4. 如果你需要将vue-element-admin中的模拟数据接口(mock)改为真实后端接口,你可以在vue-element-admin项目中的`src/mock`目录下找到对应的文件,例如`user.js`。在这些文件中,你可以修改接口的URL,将其指向Flask后端的对应接口。 5. 在修改后端交互功能和模拟数据接口后,你可能需要处理跨域访问的问题。由于vue-element-admin默认运行在9258端口,而Flask后端运行在5000端口,你需要在Flask应用中添加跨域访问的配置,以允许vue-element-admin能够跨域请求Flask后端的接口。 总结起来,vue-element-admin后端改造的步骤包括启动vue-element-admin和Flask后端服务、修改前端代码中的后端交互功能和模拟数据接口、处理跨域访问的问题。通过这些步骤,你可以将vue-element-admin与Python的Flask框架进行整合,实现后端的配合工作。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [vue-element-admin改用真实后端(python flask)数据的方法](https://blog.csdn.net/wangdandan01/article/details/103478357)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [vue-element-plus-admin整合后端实战——实现系统登录、缓存用户数据、实现动态路由](https://blog.csdn.net/seawaving/article/details/129766205)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chen__FY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值