最近在做银行转账回盘上载时出现下面异常:
java.io.IOException: Corrupt form data: premature ending at com.oreilly.servlet.multipart.MultipartParser.(MultipartParser.java:166) at com.oreilly.servlet.multipart.MultipartParser.(MultipartParser.java:94) at com.oreilly.servlet.MultipartRequest.(MultipartRequest.java:219) at com.oreilly.servlet.MultipartRequest.(MultipartRequest.java:106) |
由报错信息可以知道,出错地点位于一个公共的JAR包,引用地址为:
import com.oreilly.servlet.MultipartRequest; |
下面是出错部分的源代码,供参考:
public class BankTransferEvent extends EventSupport { /** * 构造方法 */ public BankTransferEvent(HttpServletRequest request, LifeUser lifeuser) { super(request, null, lifeuser); this.request = request; this.lifeuser = lifeuser; //后面的代码其实在父类中已经处理过 if (isMultiPartRequest(request)) { try { this.multi_request = new MultipartRequest(request, TEMP_PATH, MAX_FILE_SIZE); if (!checkRepeatedSubmit(request)) { throw new AppException(3); } } catch (Exception ex) { ex.printStackTrace(); } } } } |
其实在最开始,上面这个构造方法中并没有super(request, null, lifeuser)这一行,是因为后来要调用公共类EventSupport中的一个getParameterValues方法,我特意修改了BankTransferEvent类的结构使其继承了EventSupport类(现在想起来有点可笑,getParameterValues很好写,完全可以不加父类)。getParameterValues方法如下:
子//getParameterValues protected com.oreilly.servlet.MultipartRequest multiRequest; public String[] getParameterValues(String s) { String as[] = null; if(multiRequest != null) as = multiRequest.getParameterValues(s); else as = request.getParameterValues(s); return as; } |
现在回到上面的问题,尽管父类调用new MultipartRequest(…) 时生成的MultipartRequest与子类中的并不是同一个(即子类中的multi_request并没有继承父类中的multiRequest参数。但其实子类的构造方法中的new MultipartRequest(request, TEMP_PATH, MAX_FILE_SIZE)中的参数request已经在super(request, null, lifeuser);这步中被父类的构造方法中用过了,所以会报错。
简单点说,就是一个request参数只能用来构造一次MultipartRequest,否则就会有问题。