我正在使用嵌入式Tomcat的Spring Boot(1.5)Spring(4.3)FreeMarker。 我要上传文件。可以了我希望最大文件大小为10 MB,并且当用户尝试上传更大的文件以显示消息时。
在application.properties中,我拥有:
spring.http.multipart.max-file-size=10Mb
spring.http.multipart.max-request-size=10Mb
控制器看起来像:
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String uploadFiles(@RequestParam("uploadedFile") MultipartFile uploadedFile,
@RequestParam("overwrite") Optional<Boolean> overwrite,
RedirectAttributes redirectAttributes, ModelMap map) throws IOException {
String referer = map.get(BaseController.REFERER).toString();
if (uploadedFile.isEmpty()) {
redirectAttributes.addFlashAttribute("error", "message.file.upload.missing.file");
return "redirect:" + referer;
}
if (uploadedFile.getOriginalFilename().length() > 75) {
redirectAttributes.addFlashAttribute("warning", "message.file.upload.big.title");
return "redirect:" + referer;
}
try {
fileService.write(referer, uploadedFile, overwrite.isPresent() ? overwrite.get() : Boolean.FALSE);
redirectAttributes.addFlashAttribute("success", "message.file.upload.successful");
} catch (CustomFileException e) {
if(e.getMessage().contains("message."))
redirectAttributes.addFlashAttribute("error", e.getMessage());
else
redirectAttributes.addFlashAttribute("error", "message.file.upload.unsuccessful");
}
return "redirect:" + referer;
}
我制作了controllerAdvices(因为我希望至少要调用MultipartException。但是不会被调用。
模板如下:
<form name="uploadingForm" enctype="multipart/form-data" action="${base}/upload" method="POST">
<p>
<div><input id="fileInput" type="file" name="uploadedFile"></div>
<div style="padding-top:20px" id="selectedFiles"></div>
<input type="checkbox" name="overwrite" value="true">rewrite<br>
</p>
<p>
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<input type="submit" value="Upload files">
</p>
</form>
<div>
<div>Uploaded files:</div>
<#list uploadedFiles as file>
<div>
<a href="http://localhost:8082/funding/file/getFile/${file.getName()}/${file.getId()?c}">${file.getName()}</a>
<span>type</span><span>${file.getExtension()}</span>
<span>size</span><span>${file.getSize()}</span>
<span>version</span><span>${file.getVersion()}</span>
<span>version</span><span>${file.getCreatedDate()?date}</span>
<span>version</span><span>${file.getModifiedDate()?date}</span>
<a href="http://localhost:8082/funding/file/delete/${file.getId()?c}">delete</a>
</div>
</#list>
</div>
当我要上传10MB以下的文件时,我没有问题,并调用了我的控制器。如果我要上传更大的文件,我就没有任何例外:
页面为空,根本没有调用控制器,也没有调用ControllerAdvice。 我尝试调试没有成功。我以某种方式认为请求没有发送到终点。但是从上一个屏幕截图中,您可以看到它的状态为200。
我正在使用标准的MultipartResolver。
谢谢。
经过长时间的调试后,问题与我使用的csrf令牌有关。在某种程度上,它没有提供给请求。