springboot vue axios传递文件失败

我分别用springboot和vue作为前后端,实现前端上传文件并传递给后端的功能。代码如下,但总提示axios bad request 400错误,请问如何解决,求教!

img

img

img

axios bad request 400错误通常是因为前后端传递的数据格式不匹配所导致的,你可以尝试以下几个方法来解决问题:

  1. 检查请求头、URL和请求方法是否正确:在使用Axios进行数据传输时,通常会在请求头中指定Content-Type属性,例如application/json或multipart/form-data等。如果请求头格式错误或没有指定正确的Content-Type类型,则会返回400 Bad Request错误。

  2. 检查前端上传文件表单是否设置正确:当你使用Vue.js前端框架,通过input[type=file]元素构建一个表单并用FormData对象包装后,需要确保该表单的enctype属性为multipart/form-data,否则无法将二进制文件正常地发送到服务器。

  3. 检查后端代码实现是否正确:你需要对SpringBoot后端代码进行检查,确保它能够正确地处理前端发送的数据。可以在后端控制器层面编写一个接口,在接口中打印出从前端传递过来的数据内容,以便于确认数据是否正确的传递给了后端。

下面是一份可能有所帮助的示例代码(仅供参考):

前端代码

<template>
  <div>
    <input type="file" @change="uploadFile">
  </div>
</template>

<script>
export default {
  methods: {
    async uploadFile(e) {
      const formData = new FormData()
      formData.append('file', e.target.files[0])

      try {
        await this.$axios.post('/api/upload', formData, {
          headers: {
            'Content-Type': 'multipart/form-data'
          }
        })
        console.log('文件上传成功')
      } catch (err) {
        console.error(err)
      }
    }
  }
}
</script>

后端代码

@RestController
@RequestMapping("/api")
public class FileUploadController {
  
  /**
   * 处理文件上传请求
   */
  @PostMapping("/upload")
  public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
    try {
      // 在这里对上传的文件进行处理
      System.out.println("文件名:" + file.getOriginalFilename());
      System.out.println("文件大小:" + file.getSize());
      return new ResponseEntity<>("文件上传成功", HttpStatus.OK);
    } catch (Exception e) {
      return new ResponseEntity<>("文件上传失败", HttpStatus.INTERNAL_SERVER_ERROR);
    }
  }
}

在这个示例中,我们使用了Vue.js和SpringBoot来实现前后端交互功能。在前端部分,我们通过input[type=file]元素获取了用户上传的文件,并将文件数据包装到一个FormData对象中。在发送POST请求之前,我们设置了请求头Content-Type为multipart/form-data以确保二进制文件能够正常发送到服务器。

在后端处理部分,我们使用SpringBoot框架提供的MultipartFile类型参数,获取由前端发送的文件。在成功获取文件后,我们可以根据应用的需要对文件进行进一步处理。在本次示例中,我们简单地打印出了文件的名称和大小,方便调试和参考。最后,我们返回了一个表示文件上传成功或失败的响应。

请问后端是否可以接收到 请求 ,
提供如下截图
后端接收到的数据打印截图
前端请求的 截图

前端实现:
Vue可以使用axios库来实现文件上传并传递给后端。首先需要在前端页面中添加一个文件上传表单

<template>
  <div>
    <input type="file" ref="fileInput" @change="uploadFile"/>
  </div>
</template>

然后在Vue组件中实现文件上传方法,例如:

<script>
import axios from 'axios';

export default {
  methods: {
    uploadFile() {
      const file = this.$refs.fileInput.files[0];
      const formData = new FormData();
      formData.append('file', file);
      axios.post('/api/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      })
      .then(response => {
        console.log(response.data);
      })
      .catch(error => {
        console.log(error);
      });
    }
  }
}
</script>

在上面的代码中,首先获取上传文件的引用,然后创建一个FormData对象,并将文件添加到FormData中。最后使用axios库发送POST请求到后端的/upload接口,并将FormData作为请求体发送。

后端实现:
在Spring Boot中,可以使用MultipartHttpServletRequest来处理上传的文件。首先需要在控制器中添加一个处理文件上传的方法,例如:

@RestController
@RequestMapping("/api")
public class FileUploadController {
  
  @PostMapping("/upload")
  public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) {
    try {
      // 处理上传文件
      byte[] bytes = file.getBytes();
      // 保存文件到本地或者数据库
      // ...
      return new ResponseEntity<>("File uploaded successfully", HttpStatus.OK);
    } catch (Exception e) {
      return new ResponseEntity<>("Failed to upload file", HttpStatus.INTERNAL_SERVER_ERROR);
    }
  }
}

在上面的代码中,使用@RequestParam注解来获取上传的文件,然后将文件保存到本地或者数据库中。最后返回一个响应实体,表示文件上传成功或失败。

需要注意的是,在Spring Boot中处理文件上传时,需要在application.properties文件中添加以下配置:

spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

参数不对

断点调试一下,很简单的

this.file是一个对象不是一个文件流对象,你要取文件流,需要在this.file对象中的raw中拿到文件流再上传。