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("失败");
            }
        }
   }
}
相关推荐
Dread_lxy2 分钟前
vue 依赖注入(Provide、Inject )和混入(mixins)
前端·javascript·vue.js
java—大象1 小时前
基于java+springboot+layui的流浪动物交流信息平台设计实现
java·开发语言·spring boot·layui·课程设计
ApiHug2 小时前
ApiSmart x Qwen2.5-Coder 开源旗舰编程模型媲美 GPT-4o, ApiSmart 实测!
人工智能·spring boot·spring·ai编程·apihug
魔道不误砍柴功2 小时前
探秘Spring Boot中的@Conditional注解
数据库·spring boot·oracle
杨哥带你写代码2 小时前
网上商城系统:Spring Boot框架的实现
java·spring boot·后端
camellias_2 小时前
SpringBoot(二十一)SpringBoot自定义CURL请求类
java·spring boot·后端
龙猫蓝图2 小时前
vue el-date-picker 日期选择器禁用失效问题
前端·javascript·vue.js
peachSoda72 小时前
随手记:简单实现纯前端文件导出(XLSX)
前端·javascript·vue.js
背水2 小时前
初识Spring
java·后端·spring
晴天飛 雪2 小时前
Spring Boot MySQL 分库分表
spring boot·后端·mysql