我正在重构一些用于使用Commons Fileupload和JSP上传文件的旧代码,以使用Spring Controllers。鉴于很多文件上传代码都基于Commons Fileupload,因此我想重用该代码。第一次尝试是将代码从JSP直接移到Spring Controller,如下所示:
@RequestMapping(path = { "/my/file/upload/request/mapping" })
public ModelAndView myControllerMethod(HttpServletRequest request, HttpServletResponse response){
List<FileItem> items = null;
if (ServletFileUpload.isMultipartContent(request)) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
items = upload.parseRequest(request);
System.out.println("number of items: " + (items != null ? items.size() : "null"));
}
...
尽管程序输入if
,并将其识别为多部分请求,但始终显示number of items: 0
。
我包括了一个MultipartViewResolver
,如下:
@Configuration
@EnableWebMvc
@SuppressWarnings("deprecation")
public class WebMvcConfiguration extends WebMvcConfigurerAdapter{
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(maxFileUploadSizeBytes);
return multipartResolver;
}
但是无论有没有结果都是相同的。
正如许多地方所述(例如here (Baeldung)和here (SO)),Commons Fileupload似乎无法读取多部分,因为它已被Spring读取。因此,解决方案似乎是禁用Spring多部分支持。许多帖子讲述了如何在Spring Boot中执行此操作,但我不知道如何在原始Spring 5中执行该操作。关于如何做的任何想法?
注意:我还尝试使用 Spring方式获取多部分文件,如下所示:
@RequestMapping(path = { "/my/file/upload/request/mapping" })
public ModelAndView myControllerMethod(@RequestParam MultipartFile file){
甚至@RequestParam MultipartFile[] files
,但我分别获得了空文件或空文件数组。再次,我已经使用Firefox控制台检查了所发出的请求与旧的JSP代码完全相同,后者起作用了,因此问题不在发出的请求中。
答案 0 :(得分:1)
您缺少要绑定到的请求参数的名称。
请参阅spring的Java文档here
例如
@RequestParam("file") MultipartFile multipartFile
“文件”是您的 JSP 中的请求参数的名称。
<input type="file" name="file"><br />
并确保您也使用 POST方法。
@RequestMapping(value = "/my/file/upload/request/mapping", method = RequestMethod.POST)
答案 1 :(得分:0)
确保您的表单具有 enctype =“ multipart / form-data” ;
<form enctype="multipart/form-data" >
</form>
之后,您的请求参数需要更正为;
@RequestParam(“ file”)MultipartFile文件
不是您可以使用以下条件进行测试,并将多部分存储在字节数组中
if(file.isEmpty()){
byte [] bytefile= file.getBytes();
}
else{
logger.info("not caught");
}