struts1.2 使用FormFile上传附件超过2M就报错 在struts配置文件里<controller maxFileSize="2M" inputForward="true" /> 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你猜对了! 你用的上传组件有设置大小的方法,去查api吧一般叫setMaxFileSize() 之类的,呵呵! 楼上正解,在struts-config.xml里将maxFileSize调大就行 修改web.xml,使得ActionServlet在初试化的时候设置文件最大值,内容如下:<servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>maxFileSize</param-name> <param-value>500M</param-value><!--设置文件大小--> </init-param></servlet> Struts根本没有把上传过程中出的超出最大值的异常带到Action,因为那是不可能的,而是把它放到了rquest的Attribute里。 而出了其他异常如enctype不对,磁盘空间不足怎么办?很遗憾,Struts没有去处理它,而是log了一下,抛给了上一层了。 那我一定要获得这些全部异常咋办呢?没办法,自己定制一个MultipartRequestHandler吧,那样就能彻底解决上传过程中的控制问题了! 在此之前,我们得先去最新版的commons-fileupload控件看看上传过程中可能抛出多少异常? //所有上传异常的父类 org.apache.commons.fileupload.FileUploadException //注意:这个类的类名是FileUploadBase.SizeLimitExceededException是个public内//部类。上传的formdata总的数据超出了规定大小 org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException //注意:也是个内部类。这个才是上传的文件超出了规定大小 org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException 其它的,也看看吧: org.apache.commons.fileupload.FileUploadBase.FileUploadIOException org.apache.commons.fileupload.FileUploadBase.InvalidContentTypeException org.apache.commons.fileupload.FileUploadBase.IOFileUploadException org.apache.commons.fileupload.FileUploadBase.UnknownSizeException 要想获得尽可能仔细的数据就在处理的try/catch块里把上面的异常都catch一下,放到request的attribute里去就OK了。 另外还有要说的是,最好用commons-fileupload控件的最新版本,因为DiskFileUpload这个类,commons-fileupload已经弃用了,取而代之的是ServletFileUpload类了,所以一定要注意!切记,切记….. public void handleRequest(HttpServletRequest request) throws ServletException ...{ // Get the app config for the current request. ModuleConfig ac = (ModuleConfig) request.getAttribute(Globals.MODULE_KEY); // DiskFileItem工厂,主要用来设定上传文件的参数 DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(); // 上传文件所用到的缓冲区大小,超过此缓冲区的部分将被写入到磁盘 fileItemFactory.setSizeThreshold((int) this.getSizeThreshold(ac)); // 上传文件用到的临时文件存放位置 fileItemFactory.setRepository(this.getRepository(ac)); // 使用fileItemFactory为参数实例化一个ServletFileUpload对象 // 注意:该对象为commons-fileupload-1.2新增的类. // 对于1.2以下的commons-fileupload版本并不存在此类. ServletFileUpload upload = new ServletFileUpload(fileItemFactory); // 从session中读取对本次上传文件的最大值的限制 String maxUploadSize = (String) request.getSession().getAttribute(BasicConstants.maxUploadSize); // 获取struts-config文件中controller标签的maxFileSize属性来确定默认上传的限制 // 如果struts-config文件中controller标签的maxFileSize属性没设置则使用默认的上传限制250M. long defaultOrConfigedMaxUploadSize = this.getSizeMax(ac); if (maxUploadSize != null && maxUploadSize != "") ...{ // 如果maxUploadSize设定不正确则上传限制为defaultOrConfigedMaxUploadSize的值 // 正确则为maxUploadSize转换成的字节数 upload.setSizeMax((long) this.convertSizeToBytes(maxUploadSize, defaultOrConfigedMaxUploadSize)); } else ...{ // 如果maxUploadSize没设置则使用默认的上传限制 upload.setSizeMax(defaultOrConfigedMaxUploadSize); } // 从session中清空maxUploadSize request.getSession().removeAttribute("maxUploadSize"); // Create the hash tables to be populated. elementsText = new Hashtable(); elementsFile = new Hashtable(); elementsAll = new Hashtable(); // Parse the request into file items. List items = null; // ServletFileUpload类来处理表单请求 // 抛出的异常为FileUploadException的子异常 // 如果捕获这些异常就将捕获的异常放到session中返回. try ...{ items = upload.parseRequest(request); } catch (FileUploadBase.SizeLimitExceededException e) ...{ // 请求数据的size超出了规定的大小. request.getSession().setAttribute(BasicConstants.baseSizeLimitExceededException, e); return; } catch (FileUploadBase.FileSizeLimitExceededException e) ...{ // 请求文件的size超出了规定的大小. request.getSession().setAttribute(BasicConstants.baseFileSizeLimitExceededException, e); return; } catch (FileUploadBase.IOFileUploadException e) ...{ // 文件传输出现错误,例如磁盘空间不足等. request.getSession().setAttribute(BasicConstants.baseIOFileUploadException, e); return; } catch (FileUploadBase.InvalidContentTypeException e) ...{ // 无效的请求类型,即请求类型enctype != "multipart/form-data" request.getSession().setAttribute(BasicConstants.baseInvalidContentTypeException, e); return; } catch (FileUploadException e) ...{ // 如果都不是以上子异常,则抛出此总的异常,出现此异常原因无法说明. request.getSession().setAttribute(BasicConstants.FileUploadException, e); return; } // Partition the items into form fields and files. Iterator iter = items.iterator(); while (iter.hasNext()) ...{ FileItem item = (FileItem) iter.next(); if (item.isFormField()) ...{ addTextParameter(request, item); } else ...{ addFileParameter(item); } } } struts-config<!-- ========== Controller Configuration ================================ --> <controller> <!-- The "input" parameter on "action" elements is the name of a local or global "forward" rather than a module-relative path --> <set-property value="true" property="inputForward" /> <set-property value="text/html; charset=UTF-8" property="contentType" /> <!-- 通过写类的全名来替代struts默认的MultipartRequestHandler --> <set-property property="multipartClass" value="com.amplesky.commonmodule.struts.AmpleskyMultipartRequestHandler" /> <!-- 规定的上传文件的最大值 --> <set-property property="maxFileSize" value="15M" /> <!-- 缓冲区大小 --> <set-property property="memFileSize" value="5M" /> </controller> http://blog.csdn.net/iwindyforest/archive/2008/01/25/2065791.aspx 如何看源码啊 时间转换 Hibernate新手问题 Struts2 设置 ParentPackage 注解错误 大神们来围观啦,如何用poi画出一下效果? 急,求高手解决100分 如何在WEBLOGIC 中设置与weblogic同时启动的类? 关于weblogic7。0启动慢的问题 已经j2eeadmin -addJdbcDriver加载驱动,但是还是报错找不到合适驱动! eclipse html链接到servlet时url不一致 hibernate中一对多的set标签是否多余? jms与socket接口
一般叫
setMaxFileSize() 之类的,呵呵!
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>maxFileSize</param-name>
<param-value>500M</param-value><!--设置文件大小-->
</init-param>
</servlet>
那我一定要获得这些全部异常咋办呢?没办法,自己定制一个MultipartRequestHandler吧,那样就能彻底解决上传过程中的控制问题了! 在此之前,我们得先去最新版的commons-fileupload控件看看上传过程中可能抛出多少异常? //所有上传异常的父类 org.apache.commons.fileupload.FileUploadException
//注意:这个类的类名是FileUploadBase.SizeLimitExceededException是个public内//部类。上传的formdata总的数据超出了规定大小 org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException
//注意:也是个内部类。这个才是上传的文件超出了规定大小 org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException 其它的,也看看吧: org.apache.commons.fileupload.FileUploadBase.FileUploadIOException org.apache.commons.fileupload.FileUploadBase.InvalidContentTypeException org.apache.commons.fileupload.FileUploadBase.IOFileUploadException org.apache.commons.fileupload.FileUploadBase.UnknownSizeException
要想获得尽可能仔细的数据就在处理的try/catch块里把上面的异常都catch一下,放到request的attribute里去就OK了。 另外还有要说的是,最好用commons-fileupload控件的最新版本,因为DiskFileUpload这个类,commons-fileupload已经弃用了,取而代之的是ServletFileUpload类了,所以一定要注意!切记,切记…..
public void handleRequest(HttpServletRequest request) throws ServletException ...{
// Get the app config for the current request. ModuleConfig ac = (ModuleConfig) request.getAttribute(Globals.MODULE_KEY);
// DiskFileItem工厂,主要用来设定上传文件的参数 DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(); // 上传文件所用到的缓冲区大小,超过此缓冲区的部分将被写入到磁盘 fileItemFactory.setSizeThreshold((int) this.getSizeThreshold(ac)); // 上传文件用到的临时文件存放位置 fileItemFactory.setRepository(this.getRepository(ac));
// 使用fileItemFactory为参数实例化一个ServletFileUpload对象 // 注意:该对象为commons-fileupload-1.2新增的类. // 对于1.2以下的commons-fileupload版本并不存在此类. ServletFileUpload upload = new ServletFileUpload(fileItemFactory); // 从session中读取对本次上传文件的最大值的限制 String maxUploadSize = (String) request.getSession().getAttribute(BasicConstants.maxUploadSize); // 获取struts-config文件中controller标签的maxFileSize属性来确定默认上传的限制 // 如果struts-config文件中controller标签的maxFileSize属性没设置则使用默认的上传限制250M. long defaultOrConfigedMaxUploadSize = this.getSizeMax(ac);
if (maxUploadSize != null && maxUploadSize != "") ...{ // 如果maxUploadSize设定不正确则上传限制为defaultOrConfigedMaxUploadSize的值 // 正确则为maxUploadSize转换成的字节数 upload.setSizeMax((long) this.convertSizeToBytes(maxUploadSize, defaultOrConfigedMaxUploadSize)); } else ...{ // 如果maxUploadSize没设置则使用默认的上传限制 upload.setSizeMax(defaultOrConfigedMaxUploadSize); }
// 从session中清空maxUploadSize request.getSession().removeAttribute("maxUploadSize");
// Create the hash tables to be populated. elementsText = new Hashtable(); elementsFile = new Hashtable(); elementsAll = new Hashtable();
// Parse the request into file items. List items = null; // ServletFileUpload类来处理表单请求 // 抛出的异常为FileUploadException的子异常 // 如果捕获这些异常就将捕获的异常放到session中返回. try ...{ items = upload.parseRequest(request); } catch (FileUploadBase.SizeLimitExceededException e) ...{ // 请求数据的size超出了规定的大小. request.getSession().setAttribute(BasicConstants.baseSizeLimitExceededException, e); return; } catch (FileUploadBase.FileSizeLimitExceededException e) ...{ // 请求文件的size超出了规定的大小. request.getSession().setAttribute(BasicConstants.baseFileSizeLimitExceededException, e); return; } catch (FileUploadBase.IOFileUploadException e) ...{ // 文件传输出现错误,例如磁盘空间不足等. request.getSession().setAttribute(BasicConstants.baseIOFileUploadException, e); return; } catch (FileUploadBase.InvalidContentTypeException e) ...{ // 无效的请求类型,即请求类型enctype != "multipart/form-data" request.getSession().setAttribute(BasicConstants.baseInvalidContentTypeException, e); return; } catch (FileUploadException e) ...{ // 如果都不是以上子异常,则抛出此总的异常,出现此异常原因无法说明. request.getSession().setAttribute(BasicConstants.FileUploadException, e); return; } // Partition the items into form fields and files. Iterator iter = items.iterator(); while (iter.hasNext()) ...{ FileItem item = (FileItem) iter.next();
if (item.isFormField()) ...{ addTextParameter(request, item); } else ...{ addFileParameter(item); } } }
struts-config
<!-- ========== Controller Configuration ================================ --> <controller> <!-- The "input" parameter on "action" elements is the name of a local or global "forward" rather than a module-relative path --> <set-property value="true" property="inputForward" /> <set-property value="text/html; charset=UTF-8" property="contentType" /> <!-- 通过写类的全名来替代struts默认的MultipartRequestHandler --> <set-property property="multipartClass" value="com.amplesky.commonmodule.struts.AmpleskyMultipartRequestHandler" /> <!-- 规定的上传文件的最大值 --> <set-property property="maxFileSize" value="15M" /> <!-- 缓冲区大小 --> <set-property property="memFileSize" value="5M" /> </controller>
http://blog.csdn.net/iwindyforest/archive/2008/01/25/2065791.aspx