spring Sping Boot 上传多部分413请求实体太大

4xrmg8kj  于 2023-03-07  发布在  Spring
关注(0)|答案(2)|浏览(462)

我有这样一个方法:

@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
@PreAuthorize("@securityService.isAllowedAccessByCurrentUser(#resource?.userId)")
public Post createPost(@RequestPart(required = false) @Valid final MultipartFile media,
        @RequestPart(required = true) @Valid PostUploadDto resource, final UriComponentsBuilder uriBuilder,
        final HttpServletResponse response) {
    return service.create(resource, media);
}

在www.example.com上,我看到了这个:application.properties I have this:

# fileupload
spring.servlet.multipart.max-file-size=1024MB
spring.servlet.multipart.max-request-size=1024MB
spring.servlet.multipart.enabled=true

当我尝试上载一个1.2 MB的文件时,我得到413请求实体太大
我哪里做错了?
编辑:
下面是调用API的React代码:

export const createNewPost = async (caption, userId, tokenData, imageURI, gameId) => {
  const resource = {
    userId,
    caption,
    hashtags: allTagsFrom(caption),
    mentions: allMentionsFrom(caption),
    gameId,
    createdOn: moment()
      .utc()
      .format('YYYY-MM-DD HH:mm:ss'),
  };
  if (imageURI) {
    const { uri, type } = imageURI;
    const data = [
      {
        name: 'resource',
        type: 'application/json',
        data: JSON.stringify(resource),
      },
      {
        name: 'media',
        type,
        filename: 'media.jpg',
        data: RNFetchBlob.wrap(uri.substring(7)),
      },
    ];
    return RNFetchBlob.fetch(
      'POST',
      `${serverUrl}/post`,
      {
        Authorization: `Bearer ${tokenData.access_token}`,
        'Content-Type': 'multipart/form-data',
        Accept: 'application/json',
      },
      data
    );
  } else {
    return RNFetchBlob.fetch(
      'POST',
      `${serverUrl}/post`,
      {
        Authorization: `Bearer ${tokenData.access_token}`,
        'Content-Type': 'multipart/form-data',
        Accept: 'application/json',
      },
      [
        {
          name: 'resource',
          type: 'application/json',
          data: JSON.stringify(resource),
        },
      ]
    );
  }
};

值得注意的是,如果媒体低于某个阈值(小于我在属性文件中设置的阈值),我可以成功地进行此调用

cngwdvgl

cngwdvgl1#

createPost方法的参数列表中,将@RequestPart(required = false)更改为MultipartFile media之前的@RequestParam("file", required = false)
我怀疑从const { uri, type } = imageURI;中提取的type不是multipart/form-data,而是类似于image/jpeg的东西。
尽管您的Headers部分包含'Content-Type': 'multipart/form-data',但部件类型可能不对应,并且@RequestPart无法找到HttpMessageConverter来处理较大的多部件文件。
@RequestParam注解也可以用于multipart/form-data,在您的示例中,它似乎能够找到合适的Converter
您可以使用Fiddler之类的工具来检查API调用中的实际数据,以验证我对部件类型的怀疑,或者,您可以向createPost方法(MultipartHttpServletRequest request)添加另一个参数,以便直接从Java代码中访问各个部件的头部。

lx0bsm1f

lx0bsm1f2#

适用于Spring Webflux

如果端口号错误,则 Postman 在尝试上传文件时,会给出“413请求实体过大”的响应。

相关问题