el-upload上传图片给SpringBoot后端

  • 需求
    我的需求是,将上传文件的el-upload放到一个el-form里面,点击保存才提交,所以不能直接用action的方式,下面采用自定义上传的方式来完成
  • Vue前端
    主要是使用editForm.imgList来保存图片的信息,注意这里是一个对象,其格式如下

我这里后端传回来的是一个字符串数组,把他转为对象如下

csharp 复制代码
 this.editForm.imgList = row.imgList.map((url,index) => ({
          name:index,
          url: url,
        }));

前端主要代码

csharp 复制代码
<el-form>
        <el-form-item label="描述" prop="description">
          <el-input type="textarea" :rows="6" v-model="editForm.description" auto-complete="off"
                    placeholder="请输入描述"></el-input>
        </el-form-item>
        
        <el-form-item label="图片" prop="description">
          <el-upload
            action=""
            list-type="picture-card"
            multiple
            :on-change="handlChange"
            :file-list="editForm.imgList"
            :on-error="handleErr"
            ref="upload"
            :auto-upload="false">
            <i slot="default" class="el-icon-plus"></i>
            <div slot="file" slot-scope="{file}">
              <img
                class="el-upload-list__item-thumbnail"
                :src="file.url" alt=""
              >
              <span class="el-upload-list__item-actions">
                <span
                  class="el-upload-list__item-preview"
                  @click="handlePictureCardPreview(file)"
                >
                  <i class="el-icon-zoom-in"></i>
                </span>

                <span

                  class="el-upload-list__item-delete"
                  @click="handleRemove(file)"
                >
                  <i class="el-icon-delete"></i>
                </span>
              </span>
            </div>
          </el-upload>


        </el-form-item>
      </el-form>
  • js主要代码
csharp 复制代码
 data() {
 
    return {
   
      editForm: {
        imgList: [],
     
    },
 }
methods: {
    handleRemove(file) {

      let arr = this.$refs.upload.uploadFiles
      // 2.从pics数组中,找到图片对应的索引值
      let index = arr.indexOf(file)
      // 3.调用splice方法,移除图片信息
      arr.splice(index, 1)

    },
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url;
      this.dialogVisible = true;
    },
    handlChange(file, fileList) {
      this.editForm.imgList = fileList;
      console.log("change",this.editForm.imgList)
    },
      
    submitForm() {

      let formData = new FormData(); //  用FormData存放上传文件
      //将图片转为FormData格式
//formData.append() 方法向 FormData 对象添加同一个键(key)的多个值时,
//实际上是在创建一个值的列表,而这个键会与每个添加的值关联起来,
//后端接收到的就是一个List
      this.editForm.imgList.forEach(file => {
        console.log(file.raw)
        console.log(file.size)
        formData.append('files', file.raw)
      })
      console.log(formData)
      //自定义上传
      axios({
        method: "post",
        url: "http://localhost:8089/upload",
        headers: {
          'Content-Type': 'multipart/form-data',
          token: localStorage.getItem('logintoken')
        },
        data:formData
        // traditional: true,
      }).then(function (res){
        // console.log(res)
        return res;
      });//相当于function(res){ret   
}
  • SpringBoot后端代码
java 复制代码
@RestController
@CrossOrigin
public class ManageController {
    @Value("${saveimg.location.attractions}")
    String attractionLocation;
    
 	@RequestMapping(value = "upload")
    public void uploadImg(@RequestParam("files") List<MultipartFile> files){
        System.out.println("files = " + files);
		for (MultipartFile file : files) {
            if (!file.isEmpty()) {
                try {
                    // 构建真实的文件路径
                    Path path = Paths.get(attractionLocation + file.getOriginalFilename());
                    // 确保目录路径存在
                    Files.createDirectories(path.getParent());

                    // 将上传文件保存到指定位置
                    file.transferTo(path);

                    // 或者使用这种方式
                    // byte[] bytes = file.getBytes();
                    // Files.write(path, bytes);
                    System.out.println("保存成功");
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println( "上传失败");
                }
            }
            else {
                System.out.println("失败");
            }
        }
   }
}
相关推荐
Allen Bright几秒前
Spring Boot 整合 RabbitMQ:手动 ACK 与 QoS 配置详解
spring boot·rabbitmq·java-rabbitmq
goTsHgo23 分钟前
在 Spring Boot 的 MVC 框架中 路径匹配的实现 详解
spring boot·后端·mvc
钱多多_qdd32 分钟前
spring cache源码解析(四)——从@EnableCaching开始来阅读源码
java·spring boot·spring
waicsdn_haha34 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
飞的肖42 分钟前
前端使用 Element Plus架构vue3.0实现图片拖拉拽,后等比压缩,上传到Spring Boot后端
前端·spring boot·架构
Q_19284999061 小时前
基于Spring Boot的摄影器材租赁回收系统
java·spring boot·后端
良许Linux1 小时前
0.96寸OLED显示屏详解
linux·服务器·后端·互联网
求知若饥1 小时前
NestJS 项目实战-权限管理系统开发(六)
后端·node.js·nestjs
左羊1 小时前
【代码备忘录】复杂SQL写法案例(一)
后端
GIS开发特训营1 小时前
Vue零基础教程|从前端框架到GIS开发系列课程(七)响应式系统介绍
前端·vue.js·前端框架·gis开发·webgis·三维gis