【问题标题】:Spring Boot Upload Multipart 413 Request Entity Too LargeSpring Boot Upload Multipart 413 请求实体太大
【发布时间】:2020-01-13 19:20:03
【问题描述】:

我有这样的方法:

@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);
}

在 application.properties 我有这个:

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

当我尝试上传 1.2 MB 文件时,我收到 413 Request Entity Too Large

我做错了什么?

编辑:

这是调用 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),
        },
      ]
    );
  }
};

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

【问题讨论】:

  • 你的 POST 请求怎么样?你能展示你的 HTML 表单吗?你的表单有enctype="multipart/form-data"吗?
  • @PhilipWrage 请查看编辑
  • 我认为你有它倒退。您的发布请求应接受 JavaScript 中的多部分形式,并且不应指定内容类型
  • @ChrisMaggiulli,它仍然没有解释为什么它适用于较小的图像,但不适用于小于 1024MB 的“较大”图像,对吧?
  • 我的想法是你在说

标签: spring spring-boot multipartform-data


【解决方案1】:

createPost 方法的参数列表中将 MultipartFile media 之前的 @RequestPart(required = false) 更改为 @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 代码中访问各个部分的标头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2014-12-23
    • 1970-01-01
    • 2012-09-23
    • 2015-10-04
    • 2015-01-25
    相关资源
    最近更新 更多