网上看了很多样例,但是有很多都是过时的,里面使用的包中的FileUpload类在新的1.2里面已经改变,所以我们不能照搬原来的方法,除非你放弃使用新版本的jar包。2.1jsp方式上传upload.jsp%@pagelanguage=java%%@pagecontentType=text/html;charset=gb2312%htmlheadtitle文件上传演示/title/headbodybgcolor=#FFFFFFtext=#000000leftmargin=0topmargin=40marginwidth=0marginheight=0centerh1文件上传演示/h1formname=uploadformmethod=POSTaction=save.jspENCTYPE=multipart/form-datatableborder=1width=450cellpadding=4cellspacing=2bordercolor=#9BD7FFtrtdwidth=100%colspan=2文件1:inputname=file1size=40type=file/td/trtrtdwidth=100%colspan=2文件2:inputname=file2size=40type=file/td/trtrtdwidth=100%colspan=2文件3:inputname=file3size=40type=file/td/tr/tablebr/br/tabletrtdalign=centerinputtype=submitname=submitvalue=开始上传//td/tr/table/form/center/body/html该文件唯一要注意的地方就是红色粗体的地方,其他的没有什么区别。而正是在这个奇怪的参数上,我们利用servlet处理表单的时候就带来了一个特殊的处理方式(见后分析);save.jsp%@pagelanguage=javacontentType=text/html;charset=GBK%%@pageimport=java.util.*%%@pageimport=java.io.*%%@pageimport=org.apache.commons.fileupload.*%htmlheadtitle保存上传文件/title/headbodybgcolor='#FFFFFF'text='#000000'leftmargin='0'topmargin='40'marginwidth='0'marginheight='0'fontsize='6'color='blue'文件列表:/fontcentertablecellpadding=0cellspacing=1border=1width='100%'trtdbgcolor=#008080文件名/tdtdbgcolor=#008080大小/td/tr%Stringmsg=;DiskFileUploadfu=newDiskFileUpload();//设置允许用户上传文件大小,单位:字节//fu.setSizeMax(10000000);//设置最多只允许在内存中存储的数据,单位:字节//fu.setSizeThreshold(4096);//设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录//(临时存放目录,文件上传完毕后有办法清除它吗?)fu.setRepositoryPath(D:\\TEMP);//开始读取上传信息ListfileItems=fu.parseRequest(request);//依次处理每个上传的文件Iteratoriter=fileItems.iterator();while(iter.hasNext()){FileItemitem=(FileItem)iter.next();//忽略其他不是文件域的所有表单信息if(!item.isFormField()){Stringname=item.getName();//获取上传的文件名longsize=item.getSize();//获取上传的文件大小(字节为单位)if((name==null||name.equals())&&size==0)continue;//跳到while检查条件out.println(tr);out.println(td+name+/td);out.println(td+size+/td);//以下为文件名处理,将上传的文件保存在项目所在目录下。//获取文件名字符串的长度intend=name.length();//返回在此字符串中最右边出现的指定子字符串的索引。intbegin=name.lastIndexOf(\\);FilesavedFile=newFile(c:\\TEMP,name.substring(begin+1,end));item.write(savedFile);}}%/tablebrbrahref=upload.jsp返回上传页面/a/center/body/html以上两个文件均是来自网上,我已经做了局部修改。2.SERVLET的处理前面提到了那个特殊的form参数ENCTYPE=multipart/form-data,我在做servlet的时候用通常的request.getParameter(id),无法捕捉到该form表单的值。我们要特殊处理这个表单。以下截取的部分servlet内容:假设我的form里面有id,serid,adjunctname3个name,而adjunctname的type是file的,其他的是text的。Stringid=ChineseString.chineseStr(request.getParameter(id));Stringserid=ChineseString.chineseStr(request.getParameter(serid));Stringadjunctname=ChineseString.chineseStr(request.getParameter(adjunctname));StringoldFile=ChineseString.chineseStr(request.getParameter(oldFile));StringdownLoadFile=ChineseString.chineseStr(request.getParameter(downLoadFile));if(ServletFileUpload.isMultipartContent(request)){//Createafactoryfordisk-basedfileitemsDiskFileItemFactoryfactory=newDiskFileItemFactory();//Setfactoryconstraintsfactory.setSizeThreshold(20*1024);factory.setRepository(factory.getRepository());//CreateanewfileuploadhandlerServletFileUploadupload=newServletFileUpload(factory);//Setoverallrequestsizeconstraintupload.setFileSizeMax(20*1024*1024);Listformlists=null;try{formlists=upload.parseRequest(request);}catch(FileUploadExceptione1){//TODOAuto-generatedcatchblocke1.printStackTrace();}Iteratoriter=formlists.iterator();while(iter.hasNext()){FileItemformitem=(FileItem)iter.next();if(!formitem.isFormField()){Stringname=ChineseString.chineseStr(formitem.getName());adjunctsize=newLong(formitem.getSize()).toString();if((name==null||name.equals())&&adjunctsize.equals(0))continue;//获取纯粹的文件名adjunctname=name.substring(name.lastIndexOf(\\)+1);StringsuffixName=.+adjunctname.substring(adjunctname.lastIndexOf(.)+1);newadjunctname=newLong(GetTime.getSystemCalendar()).toString()+suffixName;//创建文件Filesavefile=newFile(IConstant.ADJUNTFILEPATH+newadjunctname);//Filesavefile=newFile(c:\\TEMP+newadjunctname);//写入文件try{formitem.write(savefile);}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}else{Stringformname=formitem.getFieldName();//获取form中的名字Stringformcontent=formitem.getString();formname=newString(formname.getBytes(),gb2312);formcontent=newString(formcontent.getBytes(),gb2312);if(formname.equals(id)){id=formcontent;}elseif(formname.equals(serid)){serid=formcontent;}}}}当我提交页面时得到的id和serid均是空的,于是做了这样的一个处理if(!formitem.isFormField())判断是否是文件域,如果不是转向文本域处理Stringformname=formitem.getFieldName();//获取form中的名字Stringformcontent=formitem.getString();formname=newString(formname.getBytes(),gb2312);formcontent=newString(formcontent.getBytes(),gb2312);if(formname.equals(id)){id=formcontent;}elseif(formname.equals(serid)){serid=formcontent;}这样才能得到正确的form中id,serid的值3.文件名称或路径乱码的处理在servelet的处理代码里面,我们看见了一些字符编码的转换,如:a.StringdownLoadFile=ChineseString.chineseStr(request.getParameter(downLoadFile));b.formname=newString(formname.getBytes(),gb2312);ChineseStri