You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot后端+React前端上传带图片的帖子时出现415 Unsupported Media Type错误的解决方法

Spring Boot后端+React前端上传带图片的帖子时出现415 Unsupported Media Type错误的解决方法

看起来你遇到的415错误核心问题出在Axios请求的Content-Type设置上!让我帮你一步步排查和解决:

错误根源分析

当你手动给Axios的multipart请求设置'Content-Type': 'multipart/form-data'时,Axios没办法自动生成请求必需的boundary分隔符——这个分隔符是后端正确解析multipart/form-data请求的关键。没有它,后端会把整个请求体识别成错误的媒体类型(比如application/octet-stream),直接返回415错误。


具体解决步骤

第一步:修复Axios请求的Content-Type配置

修改你的fetchPostFileUploadWithAuth函数,不要手动设置Content-Type为multipart/form-data,让Axios自动处理:

const fetchPostFileUploadWithAuth = async (uri, formData) => {
  const token = localStorage.getItem('token');
  const url = `${API_version}${uri}`;
  try {
    const response = await axios.post(url, formData, {
      headers: {
        // 删掉手动设置的Content-Type,Axios会自动生成正确的头信息
        "Authorization": `Bearer ${token}`,
      },
    });
    return response;
  } catch (error) {
    console.error('Error fetching data:', error);
    throw error; // 记得抛出错误,让调用方可以捕获处理
  }
};

为什么要这么做?因为当你传递FormData给Axios时,它会自动检测并设置正确的Content-Type,包括生成随机的boundary(类似multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW),这样后端就能正常解析请求了。

第二步:优化后端@RequestPart配置

检查你的后端addPostWithImage方法里的@RequestPart("caption")注解:你当前给@Parameter指定了mediaType = MediaType.APPLICATION_JSON_VALUE,但实际上caption是FormData里的普通字符串字段(不是JSON格式)。这个配置可能导致Swagger文档异常或请求解析问题,建议修改为:

@RequestPart("caption") PostPayloadDTO postPayloadDTO,

如果你的PostPayloadDTO只包含caption一个字段,甚至可以直接用@RequestPart("caption") String caption,再手动映射到DTO,这样更符合FormData的传递逻辑。

第三步:额外的健壮性优化

  1. 文件类型验证简化:后端的文件类型判断可以优化得更简洁:
List<String> allowedTypes = Arrays.asList("image/png", "image/jpg", "image/jpeg");
if (!allowedTypes.contains(contentType)) {
    return ResponseEntity.status(HttpStatus.BAD_REQUEST)
            .body("Unsupported file format. Please use PNG, JPG, or JPEG.");
}
  1. 空指针防护:后端代码里optionalAccount.get()可能抛出NoSuchElementException,建议增加空判断:
if (!optionalAccount.isPresent()) {
    return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("User not found");
}
Users users = optionalAccount.get().getUser();
  1. 字段名一致性检查:确保前端FormData的append字段名和后端@RequestPart/@RequestParam的名称完全一致(包括大小写),比如captionfilepostTypeName

备注:内容来源于stack exchange,提问作者justmevp

火山引擎 最新活动