当前位置:   article > 正文

如何使用Element-Plus+SpringBoot3实现手动上传文件?_element plus 手动上传

element plus 手动上传

一、问题及其原因

环境准备:Vue3+Element-Plus+SpringBoot3+axios

        在我的毕设中出现了这样一个问题,使用原生的form标签或者PostMan上传文件时不会出现错误,一旦使用Element-Plus中的el-upload组件上传文件时,后端老是出现如下错误:

Resolved [org.springframework.web.multipart.support.MissingServletRequestPartException: Required part 'file' is not present.]

        查询了很多资料才发现忽视了最重要的问题,el-upload组件中的文件对象和SpirngBoot中

的MultipartFile不匹配,所以才会导致后台不能接受参数。el-upload组件中的文件对象名为:UploadFile。

        先来看看原生form表单中的file对象:

         在来看看el-upload组件中的file对象:

 对比发现,在el-upload组件中的对象除了file以外还包含文件的基本信息。

        下面是UploadFile对象源码:

  1. interface UploadFile {
  2. name: string
  3. percentage?: number
  4. status: UploadStatus
  5. size?: number
  6. response?: unknown
  7. uid: number
  8. url?: string
  9. raw?: UploadRawFile
  10. }
  11. interface UploadRawFile extends File {
  12. uid: number
  13. }

所以,在后端想使用MultipartFile接口 接收参数,不能将整个UploadFile对象作为参数传递。

二、代码部分

1.前端使用el-upload组件上传文件:

  1. <el-upload v-model:file-list="fileList" action="#" list-type="picture-card" :auto-upload="false" :limit="2">
  2. <el-icon>
  3. <Plus />
  4. </el-icon>
  5. </el-upload>
  6. <el-button>取消</el-button>
  7. <el-button @click="uploadFile">提交</el-button>

说明:

        v-model:file-list="fileList" 用于接收文件列表

        :auto-upload="false" 取消自动提交

        :limit="2" 限制文件个数

2.对数据进行封装并发送ajax请求:

  1. //接收上传的文件
  2. const fileList = ref([])
  3. //上传文件
  4. const uploadFile = () => {
  5. if (fileList.value.length > 0) {
  6. // 封装为FromData对象
  7. const fromData = new FormData()
  8. fileList.value.forEach((val) => {
  9. console.log('val.raw :>> ', val.raw);
  10. fromData.append('file', val.raw)
  11. })
  12. // 发送ajax请求,上传文件
  13. if (fromData != null) {
  14. request.post('/upload', fromData, {
  15. headers: {
  16. 'Content-Type': 'multipart/form-data',
  17. }
  18. })
  19. }
  20. }
  21. }

注意:

        1.必须指定请求头 'Content-Type': 'multipart/form-data'

        2.此处我对axios进行了封装

3.后端Controller接收参数

  1. // @CrossOrigin(origins ="*" ,maxAge = 3600)
  2. @PostMapping("/upload")
  3. @ResponseBody
  4. public Object upload(@RequestParam MultipartFile[] file) {
  5. for (int i = 0; i < file.length; i++) {
  6. System.out.println(file[i].toString());
  7. }
  8. return "success";
  9. }

注意:如果出现ajax跨域问题,跨域使用 @CrossOrigin 注解

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/384057
推荐阅读
相关标签
  

闽ICP备14008679号