vue element ui + springBoot上传文件

说明

页面效果

上传流程

上传图片分2步:

  1. 前端上传图片,发给后端。后端接收图片,存到指定位置。将图片 url返回给前端

  2. 前端接收到url数据后,将表单数据 和 图片 url 发送给后端

springboot

springboot上传文件,是通过 commons-fileupload.jar、commons-io.jar 实现的,但是对其做了封装,使用起来更简单

Controller方法中,通过 MultipartFile 接口来处理文件上传

修改pom.xml

添加 commons-fileupload、commons-io 依赖:

<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.4</version>
</dependency>
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

MultipartFile接口

springboot 将上传文件的相关数据封装到 MultipartFile 接口类对象中,主要方法:

  • isEmpty():是否上传文件

  • getOriginalFilename():上传文件名称

  • transferTo():将临时文件转移到指定目录

  • getContentType():获取类型

  • getInputStream():获取输入流

  • getSize():获取上传文件大小

  • getBytes():获取上传文件的字节数组

  • getName():获取临时文件名

完整代码

package com.stdspringboot.ctrl;

import com.stdspringboot.util.UUIDUtil;
import com.stdspringboot.vo.JsonResult;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.List;

@RestController
@RequestMapping("/upload")
public class UploadCtrl {
    @PostMapping("/upload")
    public JsonResult upload(MultipartFile img) throws IOException {
        //防止不同用户上传的文件名相同,导致文件互相覆盖,所以用uuid作为文件名,如:将1.jpg改为2384234.jpg
        //获取上传文件的名字
        String oFilename=img.getOriginalFilename();
        //截取文件后缀,如:将 1.jpg 截取出 .jpg
        int pos=oFilename.lastIndexOf(".");
        String suffix=oFilename.substring(pos);

        String uuid= UUIDUtil.uuid();
        String newFile=uuid+suffix;

        /*
        拼装保存上传文件的路径
         */
        //找到classpath
        File classpath=ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX);
        //拼装保存上传文件的路径
        File uploadFile=new File(classpath,"/static/upload");
        //判断该文件夹是否存在,不存在就创建
        if(!uploadFile.exists()){
            uploadFile.mkdirs();
        }

        /*
        将上传的文件,移动到保存目录下
         */
        //拼装文件的全路径,包含路径+文件名
        File file=new File(uploadFile,newFile);
        img.transferTo(file);

        //将访问图片的url返回给前端
        return JsonResult.success("上传成功!","upload/"+newFile);
    }

    @RequestMapping("/add")
    public JsonResult add2(String name, @RequestParam(value = "uploadList",required = false) List uploadList){

        return JsonResult.success("添加成功!");
    }
}

vue

页面

注意: 上传控件的 name 属性名,与 MultipartFile 形参必须同名,否则为 null

完整代码

<template>
    <div>
        <el-form ref="form" label-width="80px">
            <el-form-item label="姓名">
                <el-col :span="8">
                <el-input v-model="name" >
                </el-input>
                </el-col>
            </el-form-item>
            <el-form-item>
                <el-upload
                    name="img"
                    action="http://localhost:8080/upload/upload"
                    list-type="picture-card"
                    :on-preview="handlePictureCardPreview"
                    :on-remove="handleRemove"
                    :on-success="uploadSucess"
                    :before-remove="beforeRemove"
                    >
                    <i class="el-icon-plus"></i>
                    </el-upload>
                    <el-dialog :visible.sync="dialogVisible">
                    <img width="100%" :src="dialogImageUrl" alt="">
                    </el-dialog>
            </el-form-item>
            <el-form-item>
                <el-button type="primary" @click="doSubmit">提交</el-button>

            </el-form-item>
            </el-form>

    </div>
</template>
<script>
import request from '@/utils/request'
import store from '@/store'

export default {
    data: function(){

        return { //是vue的配置,表示数据
            name:"", 
            dialogImageUrl: '',
            dialogVisible: false,
            uploadList: [], //上传成功后,将图片链接放到该数组中。提交表单时,要带上该数据
        }
    }
    ,
    methods:{
        doSubmit:function(){

            //显示loading
            const loading = this.$loading({
                lock: true,
                text: '请稍等...',
                spinner: 'el-icon-loading'
            });

            //调用axios发请求,需要通过post方法
            //axios中,通过post传参数,需要通过下面对象
            let params = new URLSearchParams();
            params.append("name", this.name);
            params.append("uploadList", this.uploadList)

            request({
                url: '/upload/add',
                method: 'post',
                params
            }).then(res => {
                console.log(res);
                if(res.code===0){
                    this.$message({
                        showClose: true,
                        message: '添加成功!',
                        type: 'success'
                    });
                }else{
                    this.$message({
                        showClose: true,
                        message: res.msg,
                        type: 'error'
                    });
                }
                loading.close() // 关闭loading
              })
              .catch(function (error) {// 请求失败处理
                console.log(error);
                loading.close() // 关闭loading
              });
        },
        handlePictureCardPreview(file) { //点击上传图片加号按钮执行的函数
            this.dialogImageUrl = file.url;
            this.dialogVisible = true;
        },
        beforeRemove(file, fileList) { //点击上传图片删除按钮,先执行该函数
            return this.$confirm(`确定移除 ${ file.name }?`);
        },
        handleRemove(file, fileList) { //点击上传图片删除按钮,然后执行该函数
            console.log(file, fileList);
            console.log(file.response.data)

            var index=this.uploadList.indexOf(file.response.data);
            this.uploadList.splice(index,1)
        },
        uploadSucess(response, file, fileList){ //上传图片成功的函数
            console.log(response)
            console.log(file)
            console.log(fileList)

            console.log(response.data)
            this.uploadList.push(response.data)
        }
    }
}
</script>

关键

提交数据到后端时,需要带上 uploadList 数据


原文出处:/show_1IX2uJlkQQCV.html