You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring3.3.3+Angular16多文件传JSON报415错误求助

解决Spring多文件上传接口415 Unsupported Media Type错误

核心问题分析

415错误表示请求的媒体类型不被接口支持,结合你的代码,问题主要出在前端请求构建不符合后端接口的参数解析要求,同时Postman测试的参数格式也存在问题。

一、修复Angular端请求构建代码

1. 正确传递多文件集合

后端接口@RequestPart("files") Set<MultipartFile> files期望接收多个同名的files表单参数,但你当前把所有文件打包成一个Blob再append,导致后端无法识别为多文件集合。修改方式:

let formDataWithFiles = new FormData();
const filesInfo = [] as Array<Media>;

this.postMedias.forEach(postMedia => {
  // 修复base64转File的错误:去掉dataURL前缀并解码
  const base64Data = postMedia.base64.split(',')[1];
  const byteCharacters = atob(base64Data);
  const byteNumbers = Array.from(byteCharacters, c => c.charCodeAt(0));
  const byteArray = new Uint8Array(byteNumbers);
  
  // 正确创建File对象,指定匹配的MIME类型
  const file = new File(
    [byteArray], 
    postMedia.fileData.fileName, 
    { type: `image/${postMedia.fileData.mediaExtension.toLowerCase()}` }
  );
  
  // 逐个append文件,使用同一个参数名"files"
  formDataWithFiles.append('files', file);
  filesInfo.push(postMedia.fileData);
});

2. 正确传递MediaUploadDTO集合

后端需要将mediaUploads解析为Set<MediaUploadDTO>,但直接append JSON字符串时,默认Content-Type是text/plain,后端无法自动解析为DTO对象。需要将JSON字符串包装为Blob并指定application/json类型:

// 包装JSON为Blob并指定媒体类型,让后端识别为JSON格式
const mediaBlob = new Blob([JSON.stringify(filesInfo)], { type: 'application/json' });
formDataWithFiles.append('mediaUploads', mediaBlob);

3. 避免手动设置请求头

Angular的HttpClient在传递FormData时会自动生成正确的Content-Type: multipart/form-data(包含边界符),无需手动设置,避免手动设置导致边界符不匹配的问题。

二、Postman测试的正确姿势

要匹配后端接口要求,Postman需按以下步骤配置:

  • 请求方法:POST,URL带上?profileId=你的UUID值
  • Body类型选择form-data
  • 添加参数:
    • 多个files参数:每个参数类型选File,选择本地文件,参数名均为files
    • mediaUploads参数:类型选Raw,格式选择JSON,输入对应的DTO数组(例如:[{"mediaExtension":"PNG","mediaPrivacy":"PUBLIC","mediaPrice":0.0,...}])
  • 发送请求,确认是否返回200

三、后端接口的优化建议

  1. 将Set类型改为List,Spring对List的集合解析兼容性更好:
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public List<Media> uploadMediaToS3(@RequestPart("files") List<MultipartFile> files,
                                   @RequestPart("mediaUploads") List<MediaUploadDTO> mediaUploadDTOs,
                                   @RequestParam("profileId") UUID profileId) throws IOException, FindMeDataNotFoundException {
    logger.info("WORKED! " + profileId.toString());
    return new ArrayList<>();
}
  1. 确认MediaUploadDTO类的字段与前端JSON字段完全匹配,必要时添加@JsonProperty注解指定映射关系,确保Jackson能正确反序列化。

四、验证配置

你的application.properties中multipart配置已经正确,Spring 3.3.3和Java 17环境下无需额外调整。

内容的提问来源于stack exchange,提问作者Alfredo Marin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:43:15