自定义el-upload 上传文件

前言

最近在做一个文件上传的功能,后端接口写好了、发现前端上传文件的页面不会写......(我很笨的)然后我就找啊找发现element有个组件是<el-upload/>能直接上传文件。我就想直接用拿来改改改成自己想要的,可是就是这样我花了很多时间去都改不好。网上找的好多教程都是有一定基础的人看的,不适合我这种小白,我照着他们的改是一点都改不出来效果。后面我终于摸索出来了,想着这么麻烦肯定要水一篇博客才行。

需求

我先讲一下我的需求啊,你们的和我不一样的就不用看了,免得浪费时间。就是el-upload默认是一个选中了就直接上传了(类似那种上传图片的),没有一个确定的按钮,我想分开来。点击一个按钮上传文件,再点击一个按钮确认上传。像下面这样

实现代码

这是官方的api可以去看详细解释,但是太简洁了不是我这种笨蛋看得懂的。

Upload 上传 | Element Plus

就是默认的el-upload 他有个参数是action填的是你上传的后端地址,你想自定义上传函数的话你要用http-request是覆盖它,这样就能自定义函数了。但是actio还不能省你得空着在那。

auto-upload是关闭自动上传的,你要实现一个按钮上传一个按钮提交就得关闭这个!

然后去写handleUpload函数。

javascript 复制代码
el-upload ref="upload" :show-file-list="true"
      :auto-upload="false"
      :http-request="handleUpload" 
      action=" "
      :limit="1">
      <el-button type="primary">选择文件</el-button>
      <template #tip>
        <div class="el-upload__tip">
          只能上传xlsx文件
        </div>
      </template>
    </el-upload>
    <el-button type="primary" style="margin-left: 50px;" @click='handleAction'>批量导入</el-button>

handleUpload函数 就是绑定在el-upload上的http-request属性,这个名字可以你随便取,大概解释一下就是http-request他会给你一个参数,那个参数就是你选中的那个文件的参数。下面的data.file就是那个文件的具体参数。你们可以console.log去看看它是一个对象来着的,然后创建一个FormData,将那个file赋值给formData(我不太懂这是什么意思)我是在这看到这样赋值的 我照着做就能成功了。

在下面就是一些axios请求后端接口了,url换成你们的就行,后面接的就是包含上传文件信息的formData了,最重要的是你请求的控制头一定要是 'Content-Type': 'multipart/form-data' 不然是传不了文件的,后端接口会报file null的错误。

javascript 复制代码
 handleUpload(data) {
            console.log(data)
            const file = data.file;
            console.log(file)
            const formData = new FormData();
            formData.append('file', file);

            axios.post('http://localhost:9090/user/excelUpload', formData, {
                headers: {
                    'Content-Type': 'multipart/form-data'
                }
            }).then(res => {
                console.log(res)
                if (res.data.code === '200') {
                    this.$message({
                        type: "success",
                        message: "批量导入成功"
                    })
                } else {
                    this.$message({
                        type: "error",
                        message: res.data.msg
                    })
                }
                this.$refs.upload.clearFiles(); // 清除上传的文件列表
            })
        }

说到我就很迷惑我自己用了axios封装了一个request里面定义了请求头,是json的。后面我在使用的vue文件去import使用的时候,需要覆盖它这个请求头,换成 'Content-Type': 'multipart/form-data' 嘛,它竟然是不生效的!请求还是全局设置里面的json,害得我找半天都找不到原因,一直怀疑是现在的代码是有问题的。希望有懂的大佬指点一下。

javascript 复制代码
request.interceptors.request.use(config => {
    // 设置请求头
    config.headers['Content-Type'] = 'application/json;charset=utf-8';

    return config
}, error => {
    // 请求失败,返回错误信息
    return Promise.reject(error)
})

完整的代码

javascript 复制代码
<template>
  <div style="margin: 30px; display: flex; justify-content: center;">
    <el-upload ref="upload" :show-file-list="true" :auto-upload="false" 
    :http-request="handleUpload" action=" "
      :limit="1">
      <el-button type="primary">选择文件</el-button>
      <template #tip>
        <div class="el-upload__tip">
          只能上传xlsx文件
        </div>
      </template>
    </el-upload>
    <el-button type="primary" style="margin-left: 50px;" @click='handleAction'>批量导入</el-button>
  </div>
</template>

<script>
import axios from 'axios';
export default {
  methods: {
    handleAction() {
      this.$refs.upload.submit();
    },
    // 自定义上传方法
    handleUpload(data) {
      console.log(data)
      const file = data.file;
      console.log(file)
      const formData = new FormData();
      formData.append('file', file);

      axios.post('http://localhost:9090/user/excelUpload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      }).then(res => {
        console.log(res)
        if (res.data.code === '200') {
          this.$message({
            type: "success",
            message: "批量导入成功"
          })
        } else {
          this.$message({
            type: "error",
            message: res.data.msg
          })
        }
        this.$refs.upload.clearFiles(); // 清除上传的文件列表
      })
    }
  }
}
</script>
相关推荐
持续前行1 小时前
vscode 中找settings.json 配置
前端·javascript·vue.js
JosieBook2 小时前
【Vue】11 Vue技术——Vue 中的事件处理详解
前端·javascript·vue.js
安逸点2 小时前
Vue项目中使用xlsx库解析Excel文件
vue.js
一只小阿乐2 小时前
vue 改变查询参数的值
前端·javascript·vue.js·路由·router·网文·未花中文网
小酒星小杜3 小时前
在AI时代下,技术人应该学会构建自己的反Demo地狱系统
前端·vue.js·ai编程
Code知行合壹3 小时前
Pinia入门
vue.js
今天也要晒太阳4733 小时前
element表单和vxe表单联动校验的实现
vue.js
依赖_赖4 小时前
前端实现token无感刷新
前端·javascript·vue.js
hhcccchh5 小时前
学习vue第十三天 Vue3组件深入指南:组件的艺术与科学
javascript·vue.js·学习
zhengxianyi5155 小时前
ruoyi-vue-pro本地环境搭建(超级详细,带异常处理)
前端·vue.js·前后端分离·ruoyi-vue-pro