• 自定义el-upload 上传文件


    前言

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

    需求

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

    实现代码

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

    Upload 上传 | Element Plus

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

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

    然后去写handleUpload函数。

    1. el-upload ref="upload" :show-file-list="true"
    2. :auto-upload="false"
    3. :http-request="handleUpload"
    4. action=" "
    5. :limit="1">
    6. <el-button type="primary">选择文件el-button>
    7. <template #tip>
    8. <div class="el-upload__tip">
    9. 只能上传xlsx文件
    10. div>
    11. template>
    12. <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的错误。

    1. handleUpload(data) {
    2. console.log(data)
    3. const file = data.file;
    4. console.log(file)
    5. const formData = new FormData();
    6. formData.append('file', file);
    7. axios.post('http://localhost:9090/user/excelUpload', formData, {
    8. headers: {
    9. 'Content-Type': 'multipart/form-data'
    10. }
    11. }).then(res => {
    12. console.log(res)
    13. if (res.data.code === '200') {
    14. this.$message({
    15. type: "success",
    16. message: "批量导入成功"
    17. })
    18. } else {
    19. this.$message({
    20. type: "error",
    21. message: res.data.msg
    22. })
    23. }
    24. this.$refs.upload.clearFiles(); // 清除上传的文件列表
    25. })
    26. }

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

    1. request.interceptors.request.use(config => {
    2. // 设置请求头
    3. config.headers['Content-Type'] = 'application/json;charset=utf-8';
    4. return config
    5. }, error => {
    6. // 请求失败,返回错误信息
    7. return Promise.reject(error)
    8. })


    完整的代码

    1. <script>
    2. import axios from 'axios';
    3. export default {
    4. methods: {
    5. handleAction() {
    6. this.$refs.upload.submit();
    7. },
    8. // 自定义上传方法
    9. handleUpload(data) {
    10. console.log(data)
    11. const file = data.file;
    12. console.log(file)
    13. const formData = new FormData();
    14. formData.append('file', file);
    15. axios.post('http://localhost:9090/user/excelUpload', formData, {
    16. headers: {
    17. 'Content-Type': 'multipart/form-data'
    18. }
    19. }).then(res => {
    20. console.log(res)
    21. if (res.data.code === '200') {
    22. this.$message({
    23. type: "success",
    24. message: "批量导入成功"
    25. })
    26. } else {
    27. this.$message({
    28. type: "error",
    29. message: res.data.msg
    30. })
    31. }
    32. this.$refs.upload.clearFiles(); // 清除上传的文件列表
    33. })
    34. }
    35. }
    36. }
    37. script>

  • 相关阅读:
    vue3在watch和watchEffect的使用
    一文带你深入理解 AQS
    2022年国赛高教杯数学建模E题小批量物料的生产安排解题全过程文档及程序
    TKE 超级节点,Serverless 落地的最佳形态
    浏览器无痕浏览还能查到记录吗,如何开启无痕模式
    WPF 稳定的全屏化窗口方法
    Ninja is required to load C++ extensions in Pycharm
    压缩图片怎么弄?这些方法我逢人必推
    【漏洞复现】广联达办公OAsql+文件上传+弱口令
    卸载无用Mac电脑软件应用程序方法教程
  • 原文地址:https://blog.csdn.net/ZYXKN/article/details/136288372