使用SpringMVC MultipartFile 上传图片到tomcat,当文件较小时10K以下,上传不成功,后台报错空指针异常

在使用Spring MVC MultipartFile 上传图片到tomcat本地时,当上传的文件大于10K时,上传成功,并且在tomcat中能看到图片,但是当图片文件小10K时,后台报空指针错误,tomcat中也能看到图片文件,但是都是0KB,并且无法打开图片。在后台日志中可以看到:

Found multipart file [file] of size 3183 bytes with orig-inal filename [1.jpg], stored at memory

说明文件是上传到内存中去了,想到跟spring-mvc.xml的配置有关,我的xml配置代码如下:

<bean id="multipartResolver"
         class="org.springframework.web.multipart.
         commons.CommonsMultipartResolver">
    
    <property name="defaultEncoding">
        <value>utf-8value>
    property> 
    <property name="maxUploadSize">
        <value>2080539425value>
    property>
bean>

我的controller代码如下:

@RequestMapping(value="/upload")
@ResponseBody
public ResultObj upload(@RequestParam("file")MultipartFile file,HttpServletRequest request){

String path = getSession().getServletContext().getRealPath("/");
String currDate = CommonMethod.getCurrentMonth();
String suffix = file.getOriginalFilename().
                substring(file.getOriginalFilename().
                lastIndexOf("."));
String fileDir = "upload/"+currDate.substring(0,4)+
                 "/"+currDate.substring(5, 7)+
                 "/"+MD5.getMD5(file.getOriginalFilename()+
                 System.currentTimeMillis())+suffix;
if(!FileUtils.writeMultipartFile(file, path+fileDir)){
            return new ResultObj(FAIL);
        }
        return new ResultObj(SUCCESS,fileDir);
}

通过xml配置的CommonsMultipartResolver类,找到CommonsFileUploadSupport类,然后里面有个属性

private final DiskFileItemFactory fileItemFactory;

点进去找到DEFAULT_SIZE_THRESHOLD 属性,如下:

    // ---- Manifest constants

    /**
     * The default threshold above which uploads will be stored on disk.
     */
    public static final int DEFAULT_SIZE_THRESHOLD = 10240;

上面的字段定义10K默认值,看英文解释可以推断,超过这个默认值就存在disk上,小于这个10K值存在memory中,所以在配置spring-mvc.xml文件的时候修改这个默认值,即配置文件改成这样:

<bean id="multipartResolver"
         class="org.springframework.web.multipart
         .commons.CommonsMultipartResolver">
        
    <property name="defaultEncoding">
        <value>utf-8value>
    property> 
    <property name="maxUploadSize">
        <value>2080539425value>
    property>
    <property name="fileItemFactory.sizeThreshold">
        <value>0value>
    property> 
bean>

修改完重新跑一遍,问题解决,看日志如下:

Found multipart file [file] of size 3183 bytes with original filename [1.jpg], stored at [E:\apache\apache-tomcat-8.0.44\work\Catalina\localhost\cdtjj\upload_f8fd2eda_5b87_496d_91f0_9d38a3476400_00000005.tmp]

找了半天,各种调页面,以为是webuploader的传参问题,后来发现是配置的问题。以此纪念,这个坑。

你可能感兴趣的:(springMVC)