1、Jsp页面实现文件上传下载Jsp页面实现文件上传下载 第 1 页 jsp页面实现文件上传代码开发的过程见 用TOMCAT作简单的jsp web开发名称:jsp页面上传类作者:SinNeRMail:vogoalsat特点:1 可以多文件上传;2 返回上传后的文件名;3 form表单中的其他参数也可以得到。先贴上传类,JspFileUploadpackage com.vogoal.util;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IO
2、Exception;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.Hashtable;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;/* vogoalAPI 1.0* Auther SinNeR* by * mail: vogoals*/* JSP上传文件类* author SinNeR* version 1.0*/pu
3、blic class JspFileUpload /* request对象 */ private HttpServletRequest request = null; /* 上传文件的路径 */ private String uploadPath = null; /* 每次读取得字节的大小 */ private static int BUFSIZE = 1024 * 8; /* 存储参数的Hashtable */ private Hashtable paramHt = new Hasptable(); /* 存储上传的文件的文件名的ArrayList */ private ArrayList
4、updFileArr = new ArrayList(); /* * 设定request对象。 * * param request * HttpServletRequest request对象 */ public void setRequest(HttpServletRequest request) this.request = request; /* * 设定文件上传路径。 * * param path * 用户指定的文件的上传路径。 */ public void setUploadPath(String path) this.uploadPath = path; /* * 文件上传处理主程
5、序。�������B * * return int 操作结果 0 文件操作成功;1 request对象不存在。 2 没有设定文件保存路径或者文件保存路径不正确;3 * 没有设定正确的enctype;4 文件操作异常。 */ public int process() int status = 0; / 文件上传前,对request对象,上传路径以及enctype进行check。 status = preCheck(); / 出错的时候返回错误代码。 if (status != 0) return s
6、tatus; try / ��参数或者文件名�u�� String name = null; / 参数的value String value = null; / 读取的流是否为文件的标志位 boolean fileFlag = false; / 要存储的文件。 File tmpFile = null; / 上传的文件的名字 String fName = null; FileOutputStream baos = null; BufferedOutputStream bos = null; / ��
7、存储参数的Hashtable paramHt = new Hashtable(); updFileArr = new ArrayList(); int rtnPos = 0; byte buffs = new byteBUFSIZE * 8; / �取得ContentType String contentType = request.getContentType(); int index = contentType.indexOf(boundary=); String boundary = - + contentType.substring(index + 9); String
8、endBoundary = boundary + -; / �从request对象中取得流。 ServletInputStream sis = request.getInputStream(); / 读取1行 while (rtnPos = sis.readLine(buffs, 0, buffs.length) != -1) String strBuff = new String(buffs, 0, rtnPos); / 读取1行数据�n�� if (strBuff.startsWith(boundary) if (name != nu
9、ll & name.trim().length() 0) if (fileFlag) bos.flush(); baos.close(); bos.close(); baos = null; bos = null; updFileArr.add(fName); else Object obj = paramHt.get(name); ArrayList al = new ArrayList(); if (obj != null) al = (ArrayList) obj; al.add(value); System.out.println(value); paramHt.put(name, a
10、l); name = new String(); value = new String(); fileFlag = false; fName = new String(); rtnPos = sis.readLine(buffs, 0, buffs.length); if (rtnPos != -1) strBuff = new String(buffs, 0, rtnPos); if (strBuff.toLowerCase().startsWith( content-disposition: form-data; ) int nIndex = strBuff.toLowerCase().i
11、ndexOf( name=); int nLastIndex = strBuff.toLowerCase().indexOf( , nIndex + 6); name = strBuff.substring(nIndex + 6, nLastIndex); int fIndex = strBuff.toLowerCase().indexOf( filename=); if (fIndex != -1) fileFlag = true; int fLastIndex = strBuff.toLowerCase().indexOf( , fIndex + 10); fName = strBuff.
12、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.readLine(buffs, 0, buffs.length); continue; else fName = getFileNameByTime(fName); sis.readL
13、ine(buffs, 0, buffs.length); sis.readLine(buffs, 0, buffs.length); else if (strBuff.startsWith(endBoundary) if (name != null & name.trim().length() 0) if (fileFlag) bos.flush(); baos.close(); bos.close(); baos = null; bos = null; updFileArr.add(fName); else Object obj = paramHt.get(name); ArrayList
14、al = new ArrayList(); if (obj != null) al = (ArrayList) obj; al.add(value); paramHt.put(name, al); else if (fileFlag) if (baos = null & bos = null) tmpFile = new File(uploadPath + fName); baos = new FileOutputStream(tmpFile); bos = new BufferedOutputStream(baos); bos.write(buffs, 0, rtnPos); baos.fl
15、ush(); else System.out.println(test : + value + - + strBuff); value = value + strBuff; catch (IOException e) status = 4; return status; private int preCheck() int errCode = 0; if ( request = null ) return 1; if ( uploadPath = null | uploadPath.trim().length() = 0 ) return 2; else File tmpF = new Fil
16、e(uploadPath); if (!tmpF.exists() return 2; String contentType = request.getContentType(); if ( contentType.indexOf(multipart/form-data) = -1 ) return 3; return errCode; public String getParameter(String name) String value = ; if ( name = null | name.trim().length() = 0 ) return value; value = (para
17、mHt.get(name) = null)?:(String)(ArrayList)paramHt.get(name).get(0); return value; public String getParameters(String name) if ( name = null | name.trim().length() = 0 ) return null; if ( paramHt.get(name) = null ) return null; ArrayList al = (ArrayList)paramHt.get(name); String strArr = new Stringal
18、.size(); for ( int i=0;ial.size();i+ ) strArri = (String)al.get(i); return strArr; public int getUpdFileSize() return updFileArr.size(); public String getUpdFileNames() String strArr = new StringupdFileArr.size(); for ( int i=0;iupdFileArr.size();i+ ) strArri = (String)updFileArr.get(i); return strA
19、rr; private String getFileName(String input) int fIndex = input.lastIndexOf(); if (fIndex = -1) fIndex = input.lastIndexOf(/); if (fIndex = -1) return input; input = input.substring(fIndex + 1); return input; private String getFileNameByTime(String input) int index = input.indexOf(.); Date dt = new
20、Date(); SimpleDateFormat sdf = new SimpleDateFormat(yyyyMMddHHmmssSSS); return input.substring(0,index) + sdf.format(dt) + input.substring(index); 说明:这个类基本解决了上一贴的上一贴说的存在的bug和不足。主要做了如下修正。4 用户可以设定文件上传的路径,这里没有用request对象的getRealPath方法来取得相对路径,而是用了绝对路径。是一个小败笔。因为有时候用户只是得到服务器的一个应用,而不知道整个服务器的路径。但是既然getRealPa
21、th自己可以得到,用户自己取得也可以。5 在文件上传处理的时候,预先进行了check,把一些可能出现的造成上传失败的情况拍查掉。避免该类出现不该出现的异常。6 捕获了IO异常,避免文件上传的时候出现异常时程序的不友好表现7 提供了方法返回form表单中其他参数的取得,模拟了HttpServletRequest对象的getParameter和getParameters方法(后面这个方法是叫这个名字么-_-b),取得Parameter的名称的方法没有提供,是个小缺陷。8 提供了方法返回上传的文件的件数和上传的文件名,方便用户作其他操作。现在介绍下JSP页面中如何用这个类实现上传。首先,要把这个类编
22、译后的class文件拷贝到WEB-INF/classes/目录下。注意保持package的结构。在jsp页面中引用这个类 0) / out.println(fileArr 0: + fileArr0);%使用的时候的注意事项:9 一定要设定request对象。10 一定要设定正确的上传路径。11 执行完了之后才可以得到其他参数,因为执行了之后这些参数才被分析。1,2两点如果没有做到的话,process方法执行的时候汇报错。各个用户可用的方法及说明:设定requet对象。public void setRequest(HttpServletRequest request)设定文件上传的路径。pub
23、lic void setUploadPath(String path)文件上传处理主程序。return int 操作结果 0 文件操作成功;1 request对象不存在。 2 没有设定文件保存路径或者文件保存路径不正确;3 没有设定正确的enctype;4 文件操作异常。public int process()根据name取得form表单中其他传递的参数的值(多个的话返回其中一个)public String getParameter(String name)根据name取得form表单中其他传递的参数的值(返回数组,可有多个)public String getParameters(String
24、 name)取得上传成功文件的个数public int getUpdFileSize()取得上传的文件名对应的数组。public String getUpdFileNames()注意process方法地返回值,在不是0的情况下操作失败。以下提供测试类以及测试页面(见附件):HelloPostFile.htmlHelloPostFile.jsp写在jsp中的代码的测试文件。HelloPostFileWithClass.htmlHelloPostFileWithClass.jsp抽出class后的测试文件。src在WEB-INF/src/class在WEB-INF/classes/另:由于这个文件
25、被我在中文日文系统下编辑过,注释出现乱码,所以大部分都删掉了,见谅。原码:jspUpload 第 2 页 jsp页面实现文件下载JSP文件下载类整理完成。可以在JSP页面中实现简单的下载,支持文件打包下载功能。支持将字符串或者流生成文件提供下载的功能。但是也有一些缺点。现把这个类的基本介绍总结如下。名称:jsp页面下载类作者:SinNeRMail:vogoalsat特点及功能介绍:1 支持单文件下载。支持多文件zip压缩下载。多文件zip压缩可在服务器保留或者删除副本。支持将特定的字符串或者byte数组以指定的文件名提供下载。2 在下载过程中需要提供response对象。并且选择下载形式。3
26、下载处理前先进行check,避免出现错误。4 下载处理过程中出错时,会报告错误信息。5 日文系统下文件名是中文时出现乱码问题。6 处理前需要进行相对繁琐的设定。现介绍下使用者可见的方法的功能。设定实现下载必须的response对象。public void setResponse(HttpServletResponse response)设定下载方式:0 为普通单文件下载。 1 为多文件压缩成zip包下载。 2 为将指定的字符串等拼接成文件内容提供给用户下载。public void setDownType(int fileType)设定下载时显示给用的文件名。public void setDis
27、FileName(String fileName) 压缩文件下载时,设定压缩文件暂时保存的路径(路径为绝对路径)public void setZipFilePath( String path ) 压缩文件下载时,设定服务器端生成的压缩文件是否删除。True 删除;false 保留。public void setZipDelFlag(boolean b) 压缩文件下载时,设定要压缩的文件的文件路径(路径为绝对路径)public void setZipFileNames(String fileNames)单文件下载时,设定下载文件的路径(绝对路径)public void setDownFileName(String fileName) 将字符串生成文件内容模拟下载时,设定文件的内容。参数为字符串(可多次调用)public int setFileContent(String fileContent)将字符串生成文件内容模拟下载时,设定文件的内容。参数为byte数组(可多次调用)返回
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1