Jsp面实现文件上传下载_第1页
Jsp面实现文件上传下载_第2页
Jsp面实现文件上传下载_第3页
Jsp面实现文件上传下载_第4页
Jsp面实现文件上传下载_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Jsp页面实现文件上传下载,第1页jsp页面实现文件上传代码开发的过程见用TOMCAT作简单的jspweb开发名称:jsp页面上传类作者:SinNeRMail:vogoalsat特点:1可以多文件上传;2返回上传后的文件名;3form表单中的其他参数也可以得到。先贴上传类,JspFileUploadpackagecom.vogoal.util;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.text.

2、SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;importjava.util.Hashtable;importjavax.servlet.ServletInputStream;importjavax.servlet.http.HttpServletRequest;/* vogoalAPI1.0* AutherSinNeR* * mail:vogoals*/* JSP上传文件类* authorSinNeR* version1.0*/publicclassJspFileUpload/*request对象*/priva

3、teHttpServletRequestrequest=null;/*上传文件的路径*/privateStringuploadPath=null;/*每次读取得字节的大小*/privatestaticintBUFSIZE=1024*8;/*存储参数的Hashtable*/privateHashtableparamHt=newHasptable();/*存储上传的文件的文件名的ArrayList*/privateArrayListupdFileArr=newArrayList();设定request对象。*paramrequest对象HttpServletRequestrequest*/publ

4、icvoidsetRequest(HttpServletRequestrequest)this.request=request;/*设定文件上传路径。*parampath用户指定的文件的上传路径。*/publicvoidsetUploadPath(Stringpath)this.uploadPath=path;/*文件上传处理主程序。�������B* returnint操作结果0文件操作成功;1request对象不存在。2没有设定文件保存路

5、径或者文件保存路径不正确;3* 没有设定正确的enctype;4文件操作异常。* /publicintprocess()intstatus=0;/文件上传前,对request对象,上传路径以及enctype进彳fcheck。status=preCheck();/出错的时候返回错误代码。if(status!=0)returnstatus;try/��参数或者文件名�u��Stringname=null;/参数的valueStringvalue=null;/读取的流是否为文件的标志位boo

6、leanfileFlag=false;/要存储的文件。FiletmpFile=null;/上传的文件的名字StringfName=null;FileOutputStreambaos=null;BufferedOutputStreambos=null;/��存储参数的HashtableparamHt=newHashtable();updFileArr=newArrayList();intrtnPos=0;bytebuffs=newbyteBUFSIZE*8;/�取得ContentTypeStringcontentType=requ

7、est.getContentType();intindex=contentType.indexOf("boundary=");Stringboundary="-"+contentType.substring(index+9);StringendBoundary=boundary+"-"/�从request对象中取得流。ServletInputStreamsis=request.getInputStream();/读取1行while(rtnPos=sis.readLine(buffs,0,buffs.length)

8、!=-1)StringstrBuff=newString(buffs,0,rtnPos);/读取1行数据�n��if(strBuff.startsWith(boundary)if(name!=null&&name.trim().length()>0)if(fileFlag)bos.flush();baos.close();bos.close();baos=null;bos=null;updFileArr.add(fName);elseObjectobj=paramHt.get(name);ArrayList

9、al=newArrayList();if(obj!=null)al=(ArrayList)obj;al.add(value);System.out.println(value);paramHt.put(name,al);name=newString();value=newString();fileFlag=false;fName=newString();rtnPos=sis.readLine(buffs,0,buffs.length);if(rtnPos!=-1)strBuff=newString(buffs,0,rtnPos);if(strBuff.toLowerCase().startsW

10、ith("content-disposition:form-data;")intnIndex=strBuff.toLowerCase().indexOf("name="");intnLastIndex=strBuff.toLowerCase().indexOf(""",nIndex+6);name=strBuff.substring(nIndex+6,nLastIndex);intfIndex=strBuff.toLowerCase().indexOf("filename="");if

11、(fIndex!=-1)fileFlag=true;intfLastIndex=strBuff.toLowerCase().indexOf(""",fIndex+10);fName=strBuff.substring(fIndex+10,fLastIndex);fName=getFileName(fName);if(fName=null|fName.trim().length()=0)fileFlag=false;sis.readLine(buffs,0,buffs.length);sis.readLine(buffs,0,buffs.length);sis.re

12、adLine(buffs,0,buffs.length);continue;elsefName=getFileNameByTime(fName);sis.readLine(buffs,0,buffs.length);sis.readLine(buffs,0,buffs.length);elseif(strBuff.startsWith(endBoundary)if(name!=null&&name.trim().length()>0)if(fileFlag)bos.flush();baos.close();bos.close();baos=null;bos=null;up

13、dFileArr.add(fName);elseObjectobj=paramHt.get(name);ArrayListal=newArrayList();if(obj!=null)al=(ArrayList)obj;al.add(value);paramHt.put(name,al);elseif(fileFlag)if(baos=null&&bos=null)tmpFile=newFile(uploadPath+fName);baos=newFileOutputStream(tmpFile);bos=newBufferedOutputStream(baos);baos.f

14、lush();elseSystem.out.println("test:"+value+"-"+strBuff);value=value+strBuff;catch(IOExceptione)status=4;returnstatus;privateintpreCheck()interrCode=0;if(request=null)return1;if(uploadPath=null|uploadPath.trim().length()=0)return2;elseFiletmpF=newFile(uploadPath);if(!tmpF.exists(

15、)return2;StringcontentType=request.getContentType();if(contentType.indexOf("multipart/form-data")=-1)return3;returnerrCode;publicStringgetParameter(Stringname)Stringvalue=""if(name=null|name.trim().length()=0)returnvalue;value=(paramHt.get(name)=null)?"":(String)(ArrayL

16、ist)paramHt.get(name).get(0);returnvalue;publicStringgetParameters(Stringname)if(name=null|name.trim().length()=0)returnnull;if(paramHt.get(name)=null)returnnull;ArrayListal=(ArrayList)paramHt.get(name);StringstrArr=newStringal.size();for(inti=0;i<al.size();i+)strArri=(String)al.get(i);returnstrA

17、rr;publicintgetUpdFileSize()returnupdFileArr.size();publicStringgetUpdFileNames()StringstrArr=newStringupdFileArr.size();for(inti=0;i<updFileArr.size();i+)strArri=(String)updFileArr.get(i);returnstrArr;)privateStringgetFileName(Stringinput)intfIndex=input.lastIndexOf("");if(fIndex=-1)fI

18、ndex=input.lastIndexOf("/");if(fIndex=-1)returninput;)input=input.substring(fIndex+1);returninput;)privateStringgetFileNameByTime(Stringinput)intindex=input.indexOf(".");Datedt=newDate();SimpleDateFormatsdf=newSimpleDateFormat("yyyyMMddHHmmssSSS");returninput.substring(

19、0,index)+sdf.format(dt)+input.substring(index);)说明:这个类基本解决了上一贴的上一贴说的存在的bug和不足。主要做了如下修正。4用户可以设定文件上传的路径,这里没有用request对象的getRealPath方法来取得相对路径,而是用了绝对路径。是一个小败笔。因为有时候用户只是得到服务器的一个应用,而不知道整个服务器的路径。但是既然getRealPath自己可以得到,用户自己取得也可以。5在文件上传处理的时候,预先进行了check,把一些可能出现的造成上传失败的情况拍查掉。避免该类出现不该出现的异常。HttpServletRequest对象的ge

20、tParameter6捕获了IO异常,避免文件上传的时候出现异常时程序的不友好表现7提供了方法返回form表单中其他参数的取得,模拟了和getParameters方法(后面这个方法是叫这个名字么-_-b),取得Parameter的名称的方法没有提供,是个小缺陷。8提供了方法返回上传的文件的件数和上传的文件名,方便用户作其他操作。现在介绍下JSP页面中如何用这个类实现上传。首先,要把这个类编译后的class文件拷贝到WEB-INF/classes/目录下。注意保持package的结构在jsp页面中引用这个类<%pageimport="com.vogoal.util.JspFile

21、Upload"%><%/初始化JspFileUploadjfu=newJspFileUpload();/设定request对象jfu.setRequest(request);/设定上传的文件路径jfu.setUploadPath("C:");上传处理intrtn=cess();/取得form中其他input控件参数的值Stringusername=jfu.getParameter("username");/如果对应同一个参数有多个input控件,返回数组String口usernameArr=jfu.getParamet

22、ers("username");取得上传的文件的名字String口fileArr=jfu.getUpdFileNames();取得上传文件的个数,这个方法有点鸡肋intfileNumber=jfu.getUpdFileSize();下面的是测试输出的代码。/out.println("parameter:"+username);/out.println("parametersize:"+usernameArr.length);/out.println("fileArrsize:"+fileArr.length);/i

23、f(fileArr.length>0)/out.println("fileArr0:"+fileArr0);%>使用的时候的注意事项:9 一定要设定request对象。10 一定要设定正确的上传路径。11执行完了之后才可以得到其他参数,因为执行了之后这些参数才被分析。1,2两点如果没有做到的话,process方法执行的时候汇报错。各个用户可用的方法及说明:设定requet对象。publicvoidsetRequest(HttpServletRequestrequest)设定文件上传的路径。publicvoidsetUploadPath(Stringpath)文件

24、上传处理主程序。returnint操作25果0文件操作成功;1request对象不存在。2没有设定文件保存路径或者文件保存路径不正确;3没有设定正确的enctype;4文件操作异常。publicintprocess()根据name取得form表单中其他传递的参数的值(多个的话返回其中一个)publicStringgetParameter(Stringname)根据name取得form表单中其他传递的参数的值(返回数组,可有多个)publicString口getParameters(Stringname)取得上传成功文件的个数publicintgetUpdFileSize()取得上传的文件名对应

25、的数组。publicString口getUpdFileNames()注意process方法地返回值,在不是0的情况下操作失败。以下提供测试类以及测试页面(见附件):HelloPostFile.htmlHelloPostFile.jsp写在jsp中的代码的测试文件。HelloPostFileWithClass.htmlHelloPostFileWithClass.jsp抽出class后的测试文件。src在WEB-INF/src/class在WEB-INF/classes/另:由于这个文件被我在中文日文系统下编辑过,注释出现乱码,所以大部分都删掉了,见谅。原码:jspUpload卜第2页jsp页面

26、实现文件下载JSP文件下载类整理完成。可以在JSP页面中实现简单的下载,支持文件打包下载功能。支持将字符用或者流生成文件提供下载的功能。但是也有一些缺点。现把这个类的基本介绍总结如下。名称:jsp页面下载类作者:SinNeRMail:vogoalsat特点及功能介绍:1支持单文件下载。支持多文件zip压缩下载。多文件zip压缩可在服务器保留或者删除副本。支持将特定的字符串或者byte数组以指定的文件名提供下载。2在下载过程中需要提供response对象。并且选择下载形式。3下载处理前先进行check,避免出现错误。4下载处理过程中出错时,会报告错误信息。5日文系统下文件名是中文时出现乱码问题。

27、6处理前需要进行相对繁琐的设定。现介绍下使用者可见的方法的功能。设定实现下载必须的response对象。publicvoidsetResponse(HttpServletResponseresponse)设定下载方式:0为普通单文件下载。1为多文件压缩成zip包下载。2为将指定的字符串等拼接成文件内容提供给用户下载。publicvoidsetDownType(intfileType)设定下载时显示给用的文件名。publicvoidsetDisFileName(StringfileName)压缩文件下载时,设定压缩文件暂时保存的路径(路径为绝对路径)publicvoidsetZipFilePat

28、h(Stringpath)压缩文件下载时,设定服务器端生成的压缩文件是否删除。True删除;false保留。publicvoidsetZipDelFlag(booleanb)压缩文件下载时,设定要压缩的文件的文件路径(路径为绝对路径)publicvoidsetZipFileNames(StringfileNames)单文件下载时,设定下载文件的路径(绝对路径)publicvoidsetDownFileName(StringfileName)将字符串生成文件内容模拟下载时,设定文件的内容。参数为字符串(可多次调用)publicintsetFileContent(StringfileContent

29、)将字符串生成文件内容模拟下载时,设定文件的内容。参数为byte数组(可多次调用)返回值:0操作正常;9出现IO异常。publicintsetFileContent(bytefileContent)将字符串生成文件内容模拟下载时,调用此方法结束文件内容设定。返回值:0操作正常;9出现IO异常。publicintsetFileContentEnd()主处理函数。返回值:0处理正常;1未设定response对象。2未设定文件下载方式。3未设定要显示的文件名。4未设定要下载的文件路径,或者设定的下载的文件路径不存在。9IO异常。publicintprocess()现在介绍不同下载模式下的简单流程:单

30、文件下载流程:/实例初始化JspFileDownloadjfd=newJspFileDownload();/设定response对象jfd.setResponse(response);/设定文件下载模式0单文件下载。jfd.setDownType(0);/设定显示的文件名xxxx.xxxjfd.setDisFileName(filename);/设定要下载的文件的路径,绝对路径jfd.setDownFileName(filePath);/主处理函数。注意处理返回值。intresult=cess();多文件压缩成ZIP文件下载:/实例初始化JspFileDownloadjfd=ne

31、wJspFileDownload();/设定response对象。jfd.setResponse(response);/设定下载模式1多文件压缩成ZIP文件下载。jfd.setDownType(1);/设定显示的文件名jfd.setDisFileName(filename);/设定要下载的文件的路径(数组,绝对路径)jfd.setZipFileNames(fileNames);/设定服务器端生成的zip文件是否保留。true删除false保留,默认为falsejfd.setZipDelFlag(true);/设定zip文件暂时保存的路径(是文件夹)jfd.setZipFilePath(zipf

32、older);/主处理函数注意返回值Intresult=cess();将字符串生成为文件内容,模拟文件下载:/实例初始化JspFileDownloadjfd=newJspFileDownload();/设定response对象。jfd.setResponse(response);/设定下载模式2将字符串作为文件内容,实现文件下载。jfd.setDownType(2);/设定文件显示的名称。jfd.setDisFileName(request.getParameter("filename");/主处理函数,下载前check,注意返回值out.print(jfd.

33、process();/设定要写入文件的内容,参数可为字符串或者byte数组。可多次调用。jfd.setFileContent(request.getParameter("name");/文件内容设定完了,调用函数。jfd.setFileContentEnd();以上就是简单的使用介绍。下面贴出主处理类的代码。由于在日文系统下编辑的文件。注释只能写英文,英文太差-_-b。多包涵。packagecom.vogoal.util;importjava.io.BufferedInputStream;importjava.io.File;importjava.io.FileInputS

34、tream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.util.zip.ZipEntry;importjava.util.zip.ZipOutputStream;importjavax.servlet.http.HttpServletResponse;/* vogoalAPI1.0* AutherSinNeR* * mail:vogoals*/* JSPFILEDOWNLOADSUPPORT* authorSinNeR*version1.0*/pub

35、licclassJspFileDownload/*requestobject*/privateHttpServletResponseresponse=null;/*filetype:-1un-setting;0normalfile;1zipfile;2stream*/privateintfileType=-1;/*filenametobedisplayed*/privateStringdisFileName=null;/*zipfilepath*/privateStringzipFilePath=null;/*filetobezipped*/privateStringzipFileNames=

36、null;privatebooleanzipDelFlag=false;/*filetobedownloaded*/privateStringdownFileName=null;/*errorcode0*/privatestaticfinalintPROCESS_OK=0;/*errorcode1*/privatestaticfinalintRESPONSE_IS_NULL=1;/*errorcode2*/privatestaticfinalintUNSET_DOWNLOADTYPE=2;/*errorcode3*/privatestaticfinalintUNSET_DIS_FILE_NAM

37、E=3;/*errorcode4*/privatestaticfinalintUNSET_DOWN_FILE_NAME=4;/*errorcode9*/privatestaticfinalintIO_EXCEPTION=9;/* setresponseobject* paramresponseresponseObject*/publicvoidsetResponse(HttpServletResponseresponse)this.response=response;/* setfiletype0normalfile;1zipfile;2stream* paramfileType*/publi

38、cvoidsetDownType(intfileType)this.fileType=fileType;/* setdisplayfilename* paramfileName*/publicvoidsetDisFileName(StringfileName)this.disFileName=fileName;/* setzipfilepath* paramfileNames*/publicvoidsetZipFilePath(Stringpath)this.zipFilePath=path;publicvoidsetZipDelFlag(booleanb)this.zipDelFlag=b;

39、/*setzipfilenames*paramfileNames*/publicvoidsetZipFileNames(StringfileNames)this.zipFileNames=fileNames;/*setdownloadfilename*paramfileName*/publicvoidsetDownFileName(StringfileName)this.downFileName=fileName;/*setfilecontent*paramfileContent*/publicintsetFileContent(StringfileContent)trybytebuffs=f

40、ileContent.getBytes("UTF-8");response.getOutputStream().write(buffs);catch(IOExceptione)returnIO_EXCEPTION;returnPROCESS_OK;/*setfilecontent*paramfileContent*/publicintsetFileContent(byte口fileContent)tryresponse.getOutputStream().write(fileContent);catch(IOExceptione)returnIO_EXCEPTION;ret

41、urnPROCESS_OK;/*setfilecontentend*/publicintsetFileContentEnd()tryresponse.getOutputStream().close();catch(IOExceptione)returnIO_EXCEPTION;returnPROCESS_OK;/* mainprocess* return* /publicintprocess()intstatus=PROCESS_OK;status=preCheck();if(status!=PROCESS_OK)returnstatus;StringfileName=disFileName;

42、response.setContentType("APPLICATION/OCTET-STREAM");response.setHeader("Content-Disposition","attachment;filename=""+fileName+""");intBUFSIZE=1024*8;intrtnPos=0;bytebuffs=newbyteBUFSIZE;FileInputStreaminStream=null;ZipOutputStreamzos=null;InputStream

43、is=null;Stringfilepath=null;tryif(fileType=0|fileType=1)if(fileType=0)filepath=downFileName;elsefilepath=zipFilePath+fileName;StringfileToZip=zipFileNames;zos=newZipOutputStream(newFileOutputStream(filepath);ZipEntryze=null;bytebuf=newbyteBUFSIZE;intreadLen=0;for(inti=0;i<fileToZip.length;i+)File

44、f=newFile(fileToZipi);ze=newZipEntry(f.getName();ze.setSize(f.length();ze.setTime(f.lastModified();zos.putNextEntry(ze);is=newBufferedInputStream(newFileInputStream(f);while(readLen=is.read(buf,0,BUFSIZE)!=-1)zos.write(buf,0,readLen);is.close();zos.close();inStream=newFileInputStream(filepath);while

45、(rtnPos=inStream.read(buffs)>0)response.getOutputStream().write(buffs,0,rtnPos);response.getOutputStream().close();inStream.close();if(zipDelFlag)FilefToDel=newFile(filepath);fToDel.delete();catch(IOExceptione)returnIO_EXCEPTION;finallytryif(inStream!=null)inStream.close();inStream=null;if(zos!=null)zos.close();zos=null;if(is!=null)is.close();is=null;catch(IOExceptione)returnstatus;/*precheck.*return*/privateintpreCheck()if(response=null)returnRESPONSE_IS_NULL;if(disFileName=null|disFileN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论