el-upload上传图片给SpringBoot后端

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

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

 this.editForm.imgList = row.imgList.map((url,index) => ({
          name:index,
          url: url,
        }));

前端主要代码

<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主要代码
 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后端代码

@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("失败");
            }
        }
   }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值