SpringMVC获取文件上传大小设置

本文探讨了在SpringMVC中如何设置并优化文件上传大小限制,以提升用户体验。当文件大小超过设定限制时,通过@ExceptionHandler捕获MaxUploadSizeExceededException。然而,这种方法在大文件上传时可能导致延迟错误提示。为了改善这种情况,文章建议在上传前通过CommonsMultipartResolver获取阈值,预先检查文件大小,避免长时间等待。实际应用中,通常使用ajaxfileupload.js的iframe异步上传,因此需要调整上传方法来实现这个优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做文件上传功能时,我们可能需要限制单次可上传文件的大小

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding">
        <value>UTF-8</value>
        </property>
        <property name="maxUploadSize">
                <!-- 上传文件大小限制为31M,31*1024*1024 -->
            <value>32505856</value>
        </property>
        ......
</bean>

当上传的文件大小超过限制,可以通过注解@ExceptionHandler( MaxUploadSizeExceededException.class) 进行捕获

    /**
     * 捕获上传文件过大异常
     */
    @ExceptionHandler( MaxUploadSizeExceededException.class)   
    public void handleException( Exception ex){
        // TODO Auto-generated method stub

    }

然而事实上我们会发现一个问题:
这里设置文件上传最大限制为31M,那么上传一个1G大小的文件必然是没法通过的;但是这只在服务器接收页面传过来的数据超过了31M甚至是完整的1G之后才会抛出异常并被捕获。特别是在网速十分缓慢的时候,往往在文件上传了四五分钟之后才返回大小超出限制的提示,这就给用户带来了非常糟糕的操作体验。

毫无疑问,我们需要提前获取到上限阈值。通过翻看SpringMVC文件上传部分的源码,发现能够通过CommonsMultipartResolver 获取到设置的阈值。这里在进行文件上传操作时先获取限制值的大小,未超过大小才进行上传操作,虽然这多发起了一次请求,但带来了更好的操作体验。

    @Autowired
    private CommonsMultipartResolver cmr;

    /**
     * 获取文件设置信息
     */
    @RequestMapping(value = "/getMaxSize")
    @ResponseBody
    public String getMaxSize( HttpServletRequest request) throws Exception {
        JSONObject json = new JSONObject();

        try{

            FileUpload fu = cmr.getFileUpload();

            long sizeMax = fu.getSizeMax();         // 最大文件大小限制
            String encod = fu.getHeaderEncoding();  // 编码

            json.put( "encod", encod);
            json.put( "sizeMax", sizeMax);
            json.put( "success", true);
        }catch( Exception ne){
            ne.printStackTrace();
            json.put( "success", false);
        }

        return json.toJSONString();
    }

实际中实现上传时,一般会使用 ajaxfileupload.js 通过创建 iframe 来达到异步上传的效果。所以我们需要修改 ajaxfileupload.js 文件的上传方法

    ajaxFileUpload: function(s) {
        // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout        
        s = jQuery.extend({}, jQuery.ajaxSettings, s);

        /* 
         * 添加上传文件大小限制
         * 当上传的文件大小超过限制值,不进行上传
         * */
        var fileObject =  jQuery("#" + s.fileElementId);
        if( !jQuery( fileObject).inSize()){
            s.complete( {},  status = "error");
            return;
        }

    ......

inSize() 方法的定义

    // 判断是否在最大限制之内
    jQuery.prototype.inSize = function(){

        var obj = this;

        // 这里通过设定属性data-sizeMax来减少请求的次数
        // 只有当属性data-sizeMax不存在时才发起请求获取文件大小的上限值
        var sizeMax = obj.attr('data-sizeMax');
        if( typeof( sizeMax) == 'undefined'){

            jQuery.ajax({
              url: $basePath + "/getMaxSize.jc",
              type:"post",
              dataType:"json",
              async : false,
              success:function( data){
                  sizeMax = data.sizeMax;
                  obj.attr( 'data-sizeMax', sizeMax);
              }
            });
        }

        if( typeof( sizeMax) != 'undefined' && sizeMax > 0){
            var fileSize = obj[0].files[0].size;
            if( typeof( fileSize) != 'undefined'){
            // 比较上传文件的大小和上限值
                if( fileSize > sizeMax){
                    var kb = sizeMax / 1024;
                    alert('文件大小不应大于' + kb + 'kb!');
                    return false;
                }
            }
        }
        return true;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值