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

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;
    }
}
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
引用\[1\]中的代码展示了在Element UI中实现文件上传的方法。在上传文件的回调函数中,通过将文件数据放入FormData对象中,然后将该对象作为参数传递给后台进行读写操作。后台将前端传过来的图片地址存入数据库。 引用\[2\]中的配置展示了在Spring Boot项目中配置文件上传路径和图片访问路径。通过配置nginx代理路径,可以实现图片回显。 引用\[3\]中的代码展示了如何通过后端接口获取具体的图片地址,并将其赋值给图片上传组件的file-list属性来进行展示。在赋值时,需要按照\[{name: '', url: ''}\]的格式进行赋值,以便正确回显图片。 因此,要实现Element UI中文件上传的回显,可以按照以下步骤进行操作: 1. 在文件上传的回调函数中,将后台返回的图片地址赋值给file-list属性,按照\[{name: '', url: ''}\]的格式进行赋值。 2. 在页面中使用图片上传组件,并将file-list属性绑定到回显图片数据上。 3. 配置nginx代理路径,确保图片能够正确访问。 这样,上传的文件就可以在Element UI中进行回显了。 #### 引用[.reference_title] - *1* *2* *3* [springboot+vue+elementUi 实现多文件文件上传,并且通过配置nginx 回显图片](https://blog.csdn.net/qq_42797435/article/details/123874800)[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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值