Spring 引导上传分段 413 请求实体太大
Spring Boot Upload Multipart 413 Request Entity Too Large
我有这样的方法:
@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 请求实体太大
我做错了什么?
编辑:
这是调用 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),
},
]
);
}
};
有趣的是,如果媒体低于某个阈值(小于我在属性文件中设置的阈值),我可以成功进行此调用
在 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
来处理较大的 multi-part 个文件。
@RequestParam
注释也可用于 multipart/form-data
,在您的情况下,它似乎能够找到合适的 Converter
。
您可以使用像 Fiddler 这样的工具来查看来自您的 API 调用的实际数据,以验证我对部件类型的怀疑。或者,您可以向 createPost
方法 (MultipartHttpServletRequest request
) 添加另一个参数,以直接从 Java 代码中访问各个部分的 headers。
我有这样的方法:
@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 请求实体太大
我做错了什么?
编辑:
这是调用 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),
},
]
);
}
};
有趣的是,如果媒体低于某个阈值(小于我在属性文件中设置的阈值),我可以成功进行此调用
在 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
来处理较大的 multi-part 个文件。
@RequestParam
注释也可用于 multipart/form-data
,在您的情况下,它似乎能够找到合适的 Converter
。
您可以使用像 Fiddler 这样的工具来查看来自您的 API 调用的实际数据,以验证我对部件类型的怀疑。或者,您可以向 createPost
方法 (MultipartHttpServletRequest request
) 添加另一个参数,以直接从 Java 代码中访问各个部分的 headers。