ElementUI实现多图片上传及回显功能

上传页面代码块

<el-upload
   :action="上传到后端的URL"<!--如:http://localhost:8080/api/uploadImgs  -->
   list-type="picture-card"
   :before-upload="beforeAvatarUpload"
   :on-success="handleSuccess"
   :on-remove="handleRemove"
   :multiple="false"
   :file-list="imgFileList" <!-- 这是回显图片的必要参数 -->
   :show-file-list="true"
   :limit="limitImg"
   :on-exceed="handleExceed"
 >
   <i class="el-icon-plus"></i>
   <img width="100%" :src="dialogImageUrl" alt="" />
 </el-upload>

data中的参数

data() {
      return {
		multiple: true,
		dialogImageUrl: '',//如果只是显示一张图片的话,可以直接对其赋值
        dialogVisible: false,
        imgFileList: [],//图片回显时使用
        limitImg: 4, //限制图片上传的数量
        columns: [
          {
            slot: 'imgPath',
            prop: 'imgPath',
            label: '图片',
            showOverflowTooltip: true,
            minWidth: 110
          }
        ]
	}
}

这里是table页上显示时使用的插槽写法

<!--  图片显示      -->
        <template slot="imgPath" slot-scope="scope">
          <img :src="http://localhost:8080/api/uploadImgs/20230419_4ec9954f858a4b04b6045dc005ed7cda.png" min-width="50" height="50" />
        </template>

上传所需的methods方法

beforeAvatarUpload(file) {
        const imgType = file.type === 'image/jpeg' || file.type === 'image/png';
        const imgSize= file.size / 1024 / 1024 < 5;

        if (!imgType ) {
          this.$message.error('图片只能是 JPG/PNG 格式!');
        }
        if (!imgSize) {
          this.$message.error('图片大小不能超过 5MB!');
        }
        return imgType && imgSize;
      },
      handleSuccess(res, file, fileList) {
        if (res.code === 0) {
          //这里写上传成功后的处理逻辑,如果存在修改的话可以将图片的uid、name等存下,
          //待handleRemove有移除的话,就可以将对应不存在的图片移除
        }
      },
      handleRemove(file, fileList) {
        //如果是修改的话,可以将移除的图片uid、name记录下来。
      },
      handleExceed(files, fileList) {
        this.$message.warning(`当前限制最多可以上传${this.limit}个文件`);
      }

后端代码的实现

//获取配置文件中的图片上传地址
	@Value("${config.Path}")
    String uploadImgPath;
    
    @PostMapping(value = "/uploadImg",produces = "application/json;charset=UTF-8")
    public Result uploadImg(@RequestParam("file") MultipartFile[] multipartFiles, HttpServletRequest request) throws IOException {
    	//这里的路径一定要是相对路径,不能是绝对路径,不然前端请求是无法回显的。
        //前端传递的文件上传的路径(这里看具体需要,地址可以前端传也可以后端直接取配置文件中配置的地址)
        String uploadPath = uploadImgPath+ File.separator + "vehicleImages" + File.separator;
        List<String> imgNameList = new ArrayList<>();
        for (MultipartFile file : multipartFiles) {
            if (file.isEmpty()) {
                return ResultUtils.fail("传递的文件为空,文件上传失败!");
            }
            //文件大小不超过5M-->前端代码中也有对应的限制,个人建议后端这里也再约束下。
            if (!UploadFileUtils.checkFileSize(file.getSize(), 5, "M")) {
                return ResultUtils.fail("文件大小不能超过5M");
            }
            // 获取文件名称,包含后缀
            String fileName = file.getOriginalFilename();
           //避免文件名字重复
            String uuid = UUID.randomUUID().toString().replaceAll("\\-", "");
            //获取文件后缀
            String suffix = fileName.substring(fileName.lastIndexOf("."));
            //重命名后的文件名
            fileName = uuid + suffix;
            imgNameList.add(uploadPath+fileName);
            //上传文件
            UploadFileUtils.fileupload(file.getBytes(), uploadPath, fileName);
        }
        String imgPathList = String.join("&&", imgNameList);
        return ResultUtils.successWithObject(imgPathList);
    }

后端UploadFileUtils工具类方法

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
 * @Author: TianYi
 * @Description: TODO
 * @Version: 1.0
 */
public class UploadFileUtils {

    /**
     * 通过该方法将在指定目录下添加指定文件
     *
     * @param file     文件的二进制
     * @param filePath 文件路径
     * @param fileName 文件名
     * @throws IOException
     */
    public static void fileupload(byte[] file, String filePath, String fileName) throws IOException {
        //目标目录
        File targetfile = new File(filePath);
        if (!targetfile.exists()) {
            targetfile.mkdirs();
        }
        //判断后缀名是否为允许的后缀名
        if (checkFile(fileName.substring(fileName.lastIndexOf(".")))) {
            //二进制流写入
            FileOutputStream out = new FileOutputStream(filePath + fileName);
            out.write(file);
            out.flush();
            out.close();
        }
    }

    /**
     * 判断文件大小
     *
     * @param len  文件长度
     * @param size 限制大小
     * @param unit 限制单位(B,K,M,G)
     * @return
     */
    public static boolean checkFileSize(Long len, int size, String unit) {
        double fileSize = 0;
        if ("B".equals(unit.toUpperCase())) {
            fileSize = (double) len;
        } else if ("K".equals(unit.toUpperCase())) {
            fileSize = (double) len / 1024;
        } else if ("M".equals(unit.toUpperCase())) {
            fileSize = (double) len / 1048576;
        } else if ("G".equals(unit.toUpperCase())) {
            fileSize = (double) len / 1073741824;
        }
        if (fileSize > size) {
            return false;
        }
        return true;
    }


    /**
     * 判断是否为允许的上传文件类型,true表示允许
     */
    private static boolean checkFile(String suffix) {
        //设置允许上传文件类型
        String suffixList = "jpg,png,bmp,jpeg,ico,xls,doc,ppt,txt,zip,pdf,tar";
        // 获取文件后缀
        suffix = suffix.substring(1);
        if (suffixList.contains(suffix.trim().toLowerCase())) {
            return true;
        }
        return false;
    }
}