携带参数的表单文件上传 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>
相关推荐
北城以北888820 分钟前
RocketMQ简介
java·spring boot·后端·rocketmq
折哥的程序人生 · 物流技术专研7 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
GoGeekBaird8 小时前
从 Prompt Engineering 到 Loop Engineering,我觉得 AI 开发这事儿终于开始变味了
后端·github
一条泥憨鱼8 小时前
【Redis】数据类型和常用命令
java·数据库·redis·后端·缓存
云烟成雨TD8 小时前
Spring AI Alibaba 1.x 系列【78】沙箱(Sandbox)
java·人工智能·spring
程序员二叉8 小时前
【Java】 异常高频面试题精讲 | 易错点+对比总结
java·开发语言·面试
周航宇JoeZhou8 小时前
JB3-9-SpringAI(二)
java·ai·agent·多智能体·调度·智能体·观察
好家伙VCC9 小时前
Web Components主题热切换方案揭秘
java·前端
慕木沐9 小时前
Google ADK Java 1.0版本 核心机制与实战 Demo
java·开发语言·python
Oneslide9 小时前
初始化微信小程序
后端