前后端分离使用Spring Boot + el-upload 完成图片上传

9 篇文章 0 订阅

前端环境配置

Element文档找见upload对应的代码先copy下来,这里选择的是用户头像上传中的代码。然后要替换一下action中的接口地址,换成自己后端的,这里我的后端地址为http://localhost:5277/api/article/UploadPic
在这里插入图片描述
修改一下handleAvatarSuccess方法
这里提一嘴,如果你的项目中请求的时候需要携带token,那么要在upload中加上:headers="headers属性,把token赋值给headers

 handleAvatarSuccess(res, file) {
      console.log(res);
      this.imageUrl = res.data;
      console.log("图片预览的url:"+this.imageUrl);
    }

前端整体代码如下:

<template>
  <el-upload
    class="avatar-uploader"
    action="http://localhost:5277/api/article/UploadPic"
    :show-file-list="false"
    :on-success="handleAvatarSuccess"
    :before-upload="beforeAvatarUpload"
    :headers="headers"
  >
    <img v-if="imageUrl" :src="imageUrl" class="avatar" />
    <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  </el-upload>
</template>




<style>
.avatar-uploader .el-upload {
  border: 1px dashed #d9d9d9;
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
}
.avatar-uploader .el-upload:hover {
  border-color: #409eff;
}
.avatar-uploader-icon {
  font-size: 28px;
  color: #8c939d;
  width: 178px;
  height: 178px;
  line-height: 178px;
  text-align: center;
}
.avatar {
  width: 178px;
  height: 178px;
  display: block;
}
</style>

<script>
import { getToken } from "@/utils/auth"; // get token from cookie
export default {
  data() {
    return {
      imageUrl: "",
      headers: {
        token: getToken() ? getToken() : "",
      },
    };
  },
  methods: {
    handleAvatarSuccess(res, file) {
      console.log(res);
      this.imageUrl = res.data;
      console.log("图片预览的url:"+this.imageUrl);
    },
    beforeAvatarUpload(file) {
      const isJPG = file.type === "image/jpeg";
      const isLt2M = file.size / 1024 / 1024 < 2;

      if (!isJPG) {
        this.$message.error("上传头像图片只能是 JPG 格式!");
      }
      if (!isLt2M) {
        this.$message.error("上传头像图片大小不能超过 2MB!");
      }
      return isJPG && isLt2M;
    },
  },
};
</script>

文件auth.js中的getToken()方法为

import Cookies from 'js-cookie'

const TokenKey = 'Admin-Token'

export function getToken() {
  return Cookies.get(TokenKey)
}

搭建后端环境

可以参考之前的一篇文章,用IDEA快速搭建SpringBoot环境,这里搭建环境不做重点介绍。搭建完环境以后,引入上传文件的依赖

		<!--文件上传-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

这里要重点说明一下,浏览器只能访问resources/static下的文件,之后把图片存到里面才可以直接访问。这里在static下再新建一个img文件夹专门用于存放图片。
在这里插入图片描述
如果这个img文件夹直接放在resource下是访问不到的,会报404的错误。文件会上传到target/classes/static/img目录下
在这里插入图片描述
之后访问的时候直接使用端口号+/img(如http://localhost:5277/img/2022-04-97/154b20d9-32de-43b7-997e-50e925a8becc.png)即可访问到,访问链接中不需要再img之前再加static/,否则也会报404的错误。

		//返回可供外界访问的url
        String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/img" + format + newName;

之后建立Controller文件

import com.cms.utils.ResultUtils;
import com.cms.utils.ResultVo;
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.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@RestController
@RequestMapping("/api/article")
public class ImgController {

    @PostMapping("/UploadPic")
    public ResultVo UploadPic(MultipartFile file, HttpServletRequest request) throws FileNotFoundException {

        SimpleDateFormat dateFormat = new SimpleDateFormat("/yyyy-MM-DD/");
        String filename = file.getOriginalFilename();//取得文件名称
        if (!filename.endsWith(".png") && !filename.endsWith(".jpg")) {
            return ResultUtils.error("文件类型不对");
        }

        String format = dateFormat.format(new Date());
        //realPath为文件保存的位置
        String realPath = ResourceUtils.getURL("classpath:").getPath() + "static/img" + format;
        realPath = realPath.substring(1);//去掉第一个/符号
        File folder = new File(realPath);
        if (!folder.exists()) {
            folder.mkdirs();
        }
        String newName;
        if (filename.endsWith(".png"))
            newName = UUID.randomUUID().toString() + ".png";
        else
            newName = UUID.randomUUID().toString() + ".jpg";
        try {
            //新建文件
            file.transferTo(new File(folder, newName));
            //String url = realPath + newName;
        } catch (IOException e) {
            return ResultUtils.error(e.getMessage());
        }

        //返回可供外界访问的url
        String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/img" + format + newName;
        return ResultUtils.success("图片上传成功", url);

    }
}

注:这里ResultUtils和ResultVo是我自定义的两个类

ResultUtils:

/**
 * 数据返回工具类
 */
public class ResultUtils {
    /**
     * 无参数返回
     * @return
     */
    public static ResultVo success() {
        return Vo(null, StatusCode.SUCCESS_CODE, null);
    }
    public static ResultVo success(String msg){
        return Vo(msg,StatusCode.SUCCESS_CODE,null);
    }
    /**
     * 返回带参数
     * @param msg
     * @param data
     * @return
     */
    public static ResultVo success(String msg,Object data){
        return Vo(msg,StatusCode.SUCCESS_CODE,data);
    }
    public static ResultVo success(String msg,int code,Object data){
        return Vo(msg,code,data);
    }
    public static ResultVo Vo(String msg, int code, Object data) {
        return new ResultVo(msg, code, data);
    }

    /**
     * 错误返回
     * @return
     */
    public static ResultVo error(){
        return Vo(null,StatusCode.ERROR_CODE,null);
    }
    public static ResultVo error(String msg){
        return Vo(msg,StatusCode.ERROR_CODE,null);
    }
    public static ResultVo error(String msg,int code,Object data){
        return Vo(msg,code,data);
    }
    public static ResultVo error(String msg,int code){
        return Vo(msg,code,null);
    }
    public static ResultVo error(String msg,Object data){
        return Vo(msg, StatusCode.ERROR_CODE,data);
    }
}

ResultVo:

public class ResultVo<T> {
    private String msg;
    private int code;
    private T data;
}

这样就上传成功了
在这里插入图片描述
注:如果项目中加入了Spring Security,要对图片访问链接进行放行。
再次感谢一位神秘计科大佬鼎力相助~

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
实现多文件上传的方式有很多种,下面我将介绍一种基于 VueSpring Boot 的实现方式,使用的是 Element UI 的上传组件 el-upload。 前端实现: 1. 在 Vue 组件中引入 Element UI 的 el-upload 组件。 ```vue <template> <el-upload class="upload-demo" action="/api/upload" :multiple="true" :on-change="handleUploadChange" :on-remove="handleUploadRemove" :file-list="fileList"> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> </template> ``` 2. 在 Vue 组件中定义 fileList 数组,用于存储上传的文件列表。 ```vue <script> export default { data() { return { fileList: [] } }, methods: { handleUploadChange(file, fileList) { this.fileList = fileList }, handleUploadRemove(file, fileList) { this.fileList = fileList } } } </script> ``` 3. 在 Vue 组件中定义 handleUploadChange 和 handleUploadRemove 方法,用于监听上传文件的变化和删除文件的操作,更新 fileList 数组。 后端实现: 1. 在 Spring Boot 项目中定义上传文件的接口。 ```java @RestController @RequestMapping("/api") public class FileUploadController { @PostMapping("/upload") public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile[] files) { // TODO: 处理上传的文件 return ResponseEntity.ok("上传成功"); } } ``` 2. 在接口中使用 @RequestParam 注解接收上传的文件,可以使用 MultipartFile 类型的数组来接收多个文件。接收到文件后,可以根据需要进行处理,例如保存到本地磁盘或上传到云存储服务。 3. 在 application.properties 文件中配置文件上传的相关参数。 ```properties # 文件上传配置 spring.servlet.multipart.max-file-size=500KB spring.servlet.multipart.max-request-size=100MB spring.servlet.multipart.enabled=true ``` 其中,max-file-size 和 max-request-size 分别设置了单个文件和总文件大小的最大值,enabled 表示是否启用文件上传功能。 以上就是基于 VueSpring Boot 的多文件上传实现方式,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Otto_1027

蟹蟹你,我会继续努力的~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值