携带参数的表单文件上传 axios, SpringBoot

页面上的表单如上图, 点击确定按钮需要把参数统一传给后端.

前端代码:

表单的提交方法

复制代码
const submit = async () => {
  const formData = new FormData();
  formData.append("bookName", bookForm.value.bookName);
  formData.append("author", bookForm.value.author);
  formData.append("file", bookForm.value.file);
  const res = await uploadFile("/book/saveBook", formData);
}

封装的 uploadFile方法

复制代码
export function uploadFile(url, formData) {
    return new Promise((resolve, reject) => {
        axios.post(url, formData, {
            headers: {
                'Content-Type': 'multipart/form-data'
            }
        }).then(response => {
            resolve(response)
        }).catch(error => {
            console.log("上传失败", error);
        })
    });
}

后端接口:

复制代码
    @PostMapping("/saveBook")
    public ResponseResult<?> saveBook(@ModelAttribute BookBean book) {

        System.out.println(book.getBookName() + "---" + book.getAuthor());
        System.out.println(book.getFile());
        MultipartFile file = book.getFile();
        long size = file.getSize();
        System.out.println(size);
        FileStoreInfo fileStoreInfo = fileManageService.uploadFile(file);
        System.out.println(fileStoreInfo);

        return success(null);
    }

    @Data
    public class BookBean {
        private String bookName;
        private String author;
        private MultipartFile file;
    }

===================================

页面完整代码

复制代码
<template>
  <div class="wrap">
    <div class="btn-box">
      <el-button type="primary" @click="uploadFileClick">上传文件</el-button>
    </div>
    <el-table :data="tableData" style="width: 100%">
      <el-table-column prop="id" label="ID"/>
      <el-table-column prop="bookName" label="图书名称"/>
      <el-table-column prop="author" label="作者"/>
      <el-table-column prop="coverPicture" label="封面"/>
      <el-table-column prop="" label="操作"/>
    </el-table>

    <el-dialog
        v-model="dialogVisible"
        title="新增图书信息"
        width="800"
    >
      <el-form label-width="120px">
        <el-row>
          <el-col :span="20">
            <el-form-item label="图书名称">
              <el-input v-model="bookForm.bookName"/>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="作者">
              <el-input v-model="bookForm.author"/>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="封面图片">

              <el-upload
                  ref="uploadRef"
                  :on-change="handleChange"
                  class="upload-demo"
                  :auto-upload="false"
              >
                <template #trigger>
                  <el-button type="primary" size="small">选择文件</el-button>
                </template>
              </el-upload>

            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="dialogVisible = false">取消</el-button>
          <el-button type="primary" @click="submit">确定</el-button>
        </div>
      </template>
    </el-dialog>

  </div>
</template>

<script setup>
import {ref} from "vue";
import {uploadFile} from "../network/http.js";

let tableData = ref([]);
let dialogVisible = ref(false);
let bookForm = ref({
  bookName: "",
  author: "",
  file: "",
})

const handleChange = (file) => {
  bookForm.value.file = file.raw;
}

const uploadFileClick = () => {
  dialogVisible.value = true;
}

const submit = async () => {
  const formData = new FormData();
  formData.append("bookName", bookForm.value.bookName);
  formData.append("author", bookForm.value.author);
  formData.append("file", bookForm.value.file);
  const res = await uploadFile("/book/saveBook", formData);
}

</script>
相关推荐
兔兔爱学习兔兔爱学习7 小时前
Spring Al学习7:ImageModel
java·学习·spring
lang201509288 小时前
Spring远程调用与Web服务全解析
java·前端·spring
m0_564264188 小时前
IDEA DEBUG调试时如何获取 MyBatis-Plus 动态拼接的 SQL?
java·数据库·spring boot·sql·mybatis·debug·mybatis-plus
崎岖Qiu9 小时前
【设计模式笔记06】:单一职责原则
java·笔记·设计模式·单一职责原则
Hello.Reader9 小时前
Flink ExecutionConfig 实战并行度、序列化、对象重用与全局参数
java·大数据·flink
熊小猿10 小时前
在 Spring Boot 项目中使用分页插件的两种常见方式
java·spring boot·后端
paopaokaka_luck10 小时前
基于SpringBoot+Vue的助农扶贫平台(AI问答、WebSocket实时聊天、快递物流API、协同过滤算法、Echarts图形化分析、分享链接到微博)
java·vue.js·spring boot·后端·websocket·spring
老华带你飞10 小时前
机器人信息|基于Springboot的机器人门户展示系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·机器人·论文·毕设·机器人门户展示系统
notion202510 小时前
Adobe Lightroom Classic下载与安装教程(附安装包) 2025最新版详细图文安装教程
java·数据库·其他·adobe
rengang6611 小时前
351-Spring AI Alibaba Dashscope 多模型示例
java·人工智能·spring·多模态·spring ai·ai应用编程