try {
SmartUpload su = new SmartUpload();  
su.initialize(this.getServletConfig(), request, response);        //初始化 
// 限制每个上传文件的最大长度  
mySmartUpload.setMaxFileSize(file_size_max);  
// 限制总上传数据的长度  
mySmartUpload.setTotalMaxFileSize(1024*200);  
mySmartUpload.setAllowedFilesList("jpg,JPG");
mySmartUpload.upload();
} catch (Exception e){
request.setAttribute("errormsg", "只允许上传200k以内且为JPG格式的图片");
request.getRequestDispatcher("/fetion/weizh/way/upload.jsp").forward(request, response);
}
问题是通过这种方式控制文件大小的上传时,如果我将一个非图片的视频文件后缀名强制改成jpg格式的文件,然后再进行文件上传操作,此时会走异常流程,于此同时,网络还是在一直往服务器端传送资源,从而导致客户端页面长时间没有响应,而服务器端被这样的请求耗用了大量资源,并最终导致内存溢出,请问这个问题该如何解决为好,谢谢

解决方案 »

  1.   

    jspSmartUpload是把文件直接保存在内存中的,所以如果你传了100M的文件,那么就会占用服务器100M空间,估计很快就会报“堆空间溢出”的错误。建议使用commons-fileupload包,它规避了这个问题,当文件超过你设定的大小后,会将文件保存到指定的硬盘目录参考
    http://blog.csdn.net/hdhero/archive/2005/03/22/326405.aspx
      

  2.   

    用JspSmartUpload真的没办法解决了吗?其实我这里上传的图片也很小,限制在200k以内,主要现在问题是它一方面看到图片太大,而抛出异常,但另一方面既然继续占用大量的资源,从而出现内存溢出的问题,
    其实我只希望当文件太大时,就直接验证说,图片太大,然后返回就行,而现在它不管是不是超过规定大小,都会继续往服务器端传,让我很无语
      

  3.   


    没错,jspSmartUpload是首先要读到内存中的,如果并发大的话,你的server肯定承受不了。
      

  4.   

    这个好像是个难题,因为文件必须全部传到服务器才能对其进行操作
    如果你一定要在页面判断的话,估计只能用js来读取文件大小了JspSmartUpload这个bug的确会产生问题的,因为你不能保证用户不乱传文件(虽然那么大的文件不一定能传得上)
      

  5.   

    用js判断文件大小,会出现因为安全性问题,在ie7、ie8中,无法正常获取文件的大小,所以
    var imgSrc = frm.file.value;
    var imgage = new Image();
    image.src =imgSrc;
    if(image.fileSize > 200*1024){
    error += "请选择图片大小在200k以内的图片!";
    }
    这个代码把ie安全性级别设置低以后,可以运行,不知如何改进比较好,请指点,谢谢
      

  6.   

    看来jspSmartUpload这个东西有缺陷,算了,哎。谢谢husheng86
      

  7.   

    我还想问下,通过FileUpload控制图片大小,当我故意将一个视频后缀改成jpg格式的,然后再进行上传,这是通过FileUpload判断还是会出现长时间客户端没有相应,原因还是因为request一直往服务器端传的问题,请问大家都怎么处理啊?