文件可以永久地存储信息,从本质上讲文件就是存放在盘上的一系列数据的集合。应用程序如果想长期保存数据,就必须将数据存储到文件中,这就涉及到文件的操作。而在编写网站应用程序的过程中,有许多地方要对文件进行操作。
本章将要对JSP中文件操作的应用作一些介绍,如读写文件、上传下载文件、创建删除目录等。
    
    
    7.1 数据流和File类
   
 数据从一个输入源获得。程序的结果被送到输出目的地。这些源和目的地被广泛地定义。例如一个网络连接器,内存缓冲区或磁盘文件可以被输入/输出类熟练地操作,这些外设都由相同的抽象体流(stream)来处理。
 流,是一个生产或消费信息的逻辑实体。流通过输入/输出系统与物理设备相连。尽管与之相连的实际的物理设备各不相同,所有的流都以同样的方式运转。
    
    
    7.1.1 数据流
   
Java定义了两种数据流:
字节流
和
字符流
。
- 
字节流:为处理字节式输入/输出提供了丰富的环境,其处理单元为1个字节,操作字节和字节数组。 - 
       InputStream:抽象类是表示字节输入流的所有类的超类。
 
 需要定义 InputStream 的子类的应用程序必须始终提供返回下一个输入字节的方法。
- 
       OutputStream:此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器。
 
 需要定义 OutputStream 子类的应用程序必须始终提供至少一种可写入一个输出字节的方法
 
- 
       InputStream:抽象类是表示字节输入流的所有类的超类。
- 
字符流:提供了处理任何类型输入/输出操作的足够的功能,字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串。 - 
       Reader:用于读取字符流的抽象类。
 
 子类必须实现的方法只有
 
 read(char[], int, int)
 
 和
 
 close()
 
 。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。用于读取字符流的抽象类。
- 
       Writer :写入字符流的抽象类。
 
 子类必须实现的方法仅有
 
 write(char[], int, int)
 
 、
 
 flush()
 
 和
 
 close()
 
 。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
 
- 
       Reader:用于读取字符流的抽象类。
     一个
    
     字节流
    
    可以和其他任何类型的对象并用,包括二进制数据。这样的多功能性使得字节流对很多类型的程序都很重要。字节流以
    
     InputStream
    
    和
    
     OutputStream
    
    为顶层。
    
     InputStream
    
    (输入流)是一个定义了流式字节输入模式的抽象类,该类的所有方法在出错条件下引发一个IOException异常。
    
     OutputStream
    
    (输出流)是定义了流式字节输出模式的抽象类,该类的所有方法返回一个void值并且在出错情况下引发一个IOException异常。
   
    
    
     字符流
    
    以
    
     Reader
    
    和
    
     Writer
    
    为顶层。
    
     Reader
    
    是定义Java的流式字符输入模式的抽象类,该类的所有方法在出错情况下都将引发IOException异常。
    
     Writer
    
    是定义流式字符输出的抽象类,所有该类的方法都返回一个void值并在出错条件下引发IOException异常。
   
    
    
    7.1.2 File类
   
文件和目录路径名的抽象表示形式。
    用户界面和操作系统使用与系统相关的
    
     路径名字符串
    
    来命名文件和目录。此类呈现分层路径名的一个抽象的、与系统无关的视图。
   
抽象路径名有两个组件:
- 
     一个可选的与系统有关的前缀 字符串,比如盘符,
 
 /
 
 表示 中的根目录,
 
 \\
 
 表示 Microsoft Windows UNC 路径名,
- 零个或更多字符串名称 的序列。
File类:用于文件系统操作的类
- Java内建的用来操作文件目录的类File,该类提供新增、删除与修改等操作文件相关功能所需的方法成员。
- File类没有指定信息怎样从文件读取或向文件存储;
- 它描述了文件本身的属性。
- File对象用来获取或处理与磁盘文件相关的信息,例如权限、时间、日期和目录路径。另外,File还浏览子目录层次结构。
可以用来生成File对象的构造函数如下:
    
    
     File(String directoryPath)
    
    
    
    
     File(String directoryPath, String filename)
    
    
    
    
     File(File dirObj, String filename)
    
其中,directoryPath是文件的路径名,filename是文件名,dirObj是一个指定目录的File对象。
    第一个构造函数通过全路径—路径文件名来创建对象,pathname可以是绝对路径也可以是相对路径。
    
    第二个构造函数通过父目录和文件名来创建对象,filename是不含路径的文件名。
    
    第三个构造函数也是通过父目录和文件名来创建对象,但父目录由一个File对象提供。
   
注意:文件的路径有两种形式,即绝对路径和相对路径。绝对路径包含它所指定的文件的完整路径信息,根据绝对路径就可以惟一定位一个文件。而相对路径是针对“其他某个路径”而言的,这个路径和相对路径共同定位一个文件的位置。
    File类位于命名空间
    
     java.io
    
    ,因此在JSP网页使用File类之前,必须利用以下的程序代码,将此命名空间载入:
   
<%@ page import =“java.io.*" %>
| 方 法 | 说 明 | 
|---|---|
| isDirectory () | 返回一个布尔值,true表示为目录,false则表示是文件,借以判断File对象所参考的路径是否为目录 | 
| isFile () | 返回一个布尔值,true表示为文件,false则表示是目录,借以判断File对象所参考的路径是否为文件 | 
| canRead () | 返回布尔值,true表示此为允许读取的文件 | 
| canWrite() | 返回布尔值,true表示此为允许写入的文件 | 
| exists() | 返回一个布尔值,true表示参考的文件目录存在 | 
| getName() | 取得File对象所参考的路径底下的目录或文件名称 | 
| getPath() | 取得File对象所参考的路径字符串 | 
| toString() | 将File对象转换成为以字符串类型的名称表示 | 
| equals() | 比较两个File对象是否相等 | 
 由于File对象本身仅仅只是参考一个特定的路径,因此上述的路径及文件参数也可能代表一个不存在的文件,在进行文件的操作之前,可以利用exists方法,查看文件是否存在,以判断是否进行相关的文件操作,这一点非常重要,若是尝试存取一个不存在的文件,会让系统产生一个错误的例外对象。
【例7-1】下面的范例演示一个查看文件相关性质的JSP网页实例。查看文件内容(usingFile.jsp)
<%@page contentType="text/html"%>
<%@page pageEncoding="GB2312"%>
<%@page import="java.io.*"%>
<html>
<head><title>运用 File 对象</title></head>
<body>
<% // 先在 C:盘下创建文件夹
String thePath="C:\\ch07\\theFile";
File myDir = new File(thePath);
File myFile = new File(thePath,"testFile.txt" );
File mynotExistFileFile = newFile(thePath,"notExistFile.txt" ) ;
out.println("目录"+thePath+"是否存在:"+myDir.exists()+"<BR>" );
out.println("文件"+thePath+"\\testFile.txt 是否存在:"+myFile.exists()+"<BR>");
out.println("文件"+thePath+"\\notExistFile.txt 是否存在:"+mynotExistFileFile.exists()+"<BR>"+"<BR>");
out.println("文件"+thePath+"\\testFile.txt 是否可读取:"+myFile.canRead()+"<BR> );
out.println("文件"+thePath+"\\testFile.txt 是否可写入:"+myFile.canWrite()+"<BR>");
%>
</body>
</html>
一般文件的维护操作包含了新增、删除及列举等操作,File类本身也提供了相关功能的方法成员,列举如表所示
| 方 法 | 说 明 | 
|---|---|
| createNewFile() | 创建一个新文件 | 
| delete() | 删除指定的文件 | 
| renameTo() | 重新命名文件 | 
| setReadonly | 将文件对象所参照的文件设为只读 | 
| mkdir() | 建一指定的目录 | 
| mkdirs() | 建立指定路径底下的所有目录 | 
    
    
    1、创建文件与目录文件夹
   
    File类提供一个名称为
    
     createNewFile()
    
    的方法成员,用以建立File对象参数所指定的文件,以下为引用此方法的程序代码范例片段:
    
    
     boolean blCreate = myFile.createNewFile() ;
    
     由于
    
     createNewFile()
    
    返回一个布尔值,因此必须利用声明为
    
     boolean
    
    类型的变量存储运行结果,若是上式
    
     blCreate
    
    结果值为
    
     tru
    
    e,表示文件建立成功;若是
    
     false
    
    则表示文件建立失败,并且返回一个IOException例外对象,这个情形通常发生在指定的目录底下已经存在所要建立的文件,因此在建立文件之前查看其是否存在是非常重要的操作。
   
     File类另外提供建立目录的方法成员mkdir,必须利用File类的实体对象引用这个方法以建立指定的目录,例如以下的程序代码
    
    
    
     File myFile = new File(pathName);
    
    
    
    
     bool blMK = myFile.mkdir();
    
     其中的返回值意义同上述
    
     CreateNewFile
    
    方法,这里必须注意的是,由于引用这个方法所要建立的是一个目录,因此第1行程序代码中所指定的参数值必须是一个路径而非文件,同时指定建立的目录其上层目录的路径必须是存在的,例如下面的程序代码:
   
boolean blNew;
File myDir = new File("C:/testDir/newDir");
blNew = myDir.mkdir();
     其中
    
     mkdir()
    
    在
    
     C:/testDir
    
    目录下建立一个新的目录
    
     newDir
    
    ,前提是
    
     C:/testDir
    
    目录必须存在,否则建立目录的作业将会失败。
   
     另外一个类似
    
     mkdir()
    
    的方法为
    
     mkdirs()
    
    ,这个方法不同的地方在于若是指定的目录路径不存在,则整个目录结构均将被创建,例如以下的程序代码:
   
File myMkDirs = new File("C:/firstDir/secondDir/thirdDir");
blNew = myMkDirs.mkdirs();
     当网页运行该段程序代码的时候,其中
    
     C:/firstDir/secondDir/thirdDir
    
    这个路径的文件夹以及子文件夹,都会被建立。
   
    
    
    2、删除文件与目录数据夹
   
     删除文件或者是目录非常容易,只要引用File类所提供的方法成员
    
     delete()
    
    即可。这个方法将会删除File对象本身所代表的文件或是目录,也就是建立File对象,指定路径底下的文件,或是建立对象时所输入的特定目录路径参数。
    
    
    
     delete
    
    方法有一个布尔类型的返回值,若是成功删除指定删除文件,则返回值为
    
     true
    
    ,当指定的文件不存在,或是指定的文件删除失败,则返回值为
    
     false
    
    。
    
     另外必须特别注意的是,
    
     delete
    
    方法
    
     只能删除空目录
    
    ,若是目录底下存在任何文件或是子目录,删除的操作会失败,并且返回一个代表删除目录失败的
    
     false
    
    布尔值。
   
    
    
    7.2 读写文本文件
   
读写文件是文件操作最基本的内容。
    读写文本文件所需的功能,主要由2个类所提供:
    
     FileWriter()
    
    及
    
     FileReader()
    
    。
   
- 
     
 FileReader()
 
 则用以读取文件中的数据。
 
 语法如下:
 
 FileReader myFileReader = new FileReader(strFileName);
 
 
 
 必须输入指定操作的文件完整路径名称或是File对象
 
- 
     
 FileWriter()
 
 负责将数据写入文件
 
 语法如下:
 
 FileWriter myFileWriter = new FileWriter(fileName);
 
 
 将数据写入文本文件之前,首先必须建立
 
 FileWriter
 
 对象,同时传入所要操作的文件完整路径名称字符串.
    
    
    7.3 文件的浏览
   
    【例7-3】浏览当前目录中文件与子目录的例子
    
     browserFile.jsp
    
    ,例子执行后,会在浏览器中输出当前目录中的所有文件和子目录,并对文件和子目录进行统计。
   
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>文件的浏览</title>
</head>
<body>
<h1>文件的浏览</h1>
<%int fcount=0,dcount=0;%>
<%
String path=request.getRealPath("/");
// 建立当前目录中文件的 File 对象
File d=new File(path);
// 取得代表目录中所有文件的 File 对象数组
File list[]=d.listFiles();
out.println("<font color=#ff0000>" + path + "目录下的文件: </font><br>");
// 循环输出当前目录下的所有文件
for(int i=0;i<list.length;i++) {
	if(list[i].isFile()) {
		out.println(list[i].getName() + "<br>");
		fcount++;
	}
}
out.println("<br><font color=#ff0000>" + path + "目录下的目录: </font><br>");
// 循环输出当前目录下的所有子目录
for(int i=0;i<list.length;i++) {
	if(list[i].isDirectory()) {
		out.println(list[i].getName() + "<br>");
		dcount++;
	}
}
%>
<hr>
<h3>统计结果: </h3>
<center>
文件总数: <%=fcount%><br>
目录总数: <%=dcount%><br>
</center>
</body>
</html>
     
   
    
    
    7.4 创建和删除目录
   
    【例 7-4】编写一个有关目录的创建与删除的例子
    
     Directory.jsp
    
    。本例的效果是,如果没有目录文件就创建一个新的目录文件,如果目录文件存在就删除该目录文件。代码如下:
   
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>目录的创建、检查与删除</title>
</head>
<body>
<% String path = request.getRealPath("");
path = path + "\\text";
// 将要建立的目录路径
File d = new File(path);
// 建立代表 uploadFile 目录的 File 对象,并得到它的一个引用
if(d.exists()) {
	// 检查 uploadFile 目录是否存在
	d.delete();
	out.println("uploadFile 目录存在,现被删除");
} else {
	d.mkdir();
	// 建立 uploadFile 目录
	out.println("uploadFile 目录不存在,现被建立");
}
%>
</body>
</html>
    
    
    
     7.5
    
    
     文件的上传和下载
    
   
    【例7-5】 在这里我们写一个简单的页面
    
     uploadfile.jsp
    
    ,提供一个表单,用户从这里选择文件并把文件上载到服务器。
   
    
     uploadfile.jsp
    
<%@ page contentType="text/html;charset=gb2312" %>
<html>
<head><title>上传文件</title></head>
<body bgcolor="#ffffff" text="#000000">
<p><b><font size=5>选择要上传文件</font></b></p>
<form METHOD="POST" ACTION="uploadfile1.jsp" ENCTYPE="multipart/form-data">
    <INPUT TYPE="FILE" NAME="FILE1" SIZE="30"><BR>
    <INPUT TYPE="SUBMIT" VALUE="开始上传">
</form>
</body>
</html>
在 uploadfile.jsp 页面中,需要注意的是:
<FORM METHOD="POST" ACTION="uploadfile1.jsp" ENCTYPE="multipart/form-data">
    在该语句中,
    
     ENCTYPE="multipart/form-data"
    
    表示以二进制的方式传递提交的数据。
   
现在创建处理信息的页面 uploadfile1.jsp, 实现获取文件里面的信息并保存在指定的文件夹upload 内的功能,代码如下:
    
     uploadfile1.jsp
    
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<html><head><title>upFile</title></head>
<body bgcolor="#ffffff">
<%
int MAX_SIZE = 102400 * 102400; //定义上载文件的最大字节
String rootPath; // 创建根路径的保存变量
DataInputStream in = null; //声明文件读入类
FileOutputStream fileOut = null;
String remoteAddr = request.getRemoteAddr(); //取得客户端的网络地址
String serverName = request.getServerName(); //获得服务器的名字
String realPath = request.getRealPath("/");//取得互联网程序的绝对地址
realPath = realPath.substring(0,realPath.lastIndexOf("\\"));
rootPath = realPath + "\\upload\\"; //创建文件的保存目录
out.println("上传文件保存目录为"+rootPath);
String contentType = request.getContentType(); //取得客户端上传的数据类型
try{
	if(contentType.indexOf("multipart/form-data") >= 0){
		in = new DataInputStream(request.getInputStream()); //读入上传的数据
		int formDataLength = request.getContentLength();
		if(formDataLength > MAX_SIZE){
			out.println("<P>上传的文件字节数不可以超过" + MAX_SIZE + "</p>");
			return;
		}
		byte dataBytes[] = new byte[formDataLength]; //保存上传文件的数据
		int byteRead = 0;
		int totalBytesRead = 0;
		while(totalBytesRead < formDataLength){ //上传的数据保存在 byte 数组
			byteRead = in.read(dataBytes,totalBytesRead,formDataLength);
			totalBytesRead += byteRead;
		}
		String file = new String(dataBytes); //根据 byte 数组创建字符串
		String saveFile = file.substring(file.indexOf("filename=\"") + 10); //取得上传数据的文件名
		saveFile = saveFile.substring(0,saveFile.indexOf("\n"));
		saveFile = saveFile.substring(saveFile.lastIndexOf("\\") + 1, saveFile.indexOf("\""));
		int lastIndex = contentType.lastIndexOf("=");
		// 取得数据的分隔字符串
		String boundary = contentType.substring(lastIndex + 1,contentType.length());
		String fileName = rootPath + saveFile;
		int pos;
		pos = file.indexOf("filename=\"");
		pos = file.indexOf("\n",pos) + 1;
		pos = file.indexOf("\n",pos) + 1;
		pos = file.indexOf("\n",pos) + 1;
		int boundaryLocation = file.indexOf(boundary,pos) - 4;
		int startPos = ((file.substring(0,pos)).getBytes()).length;//取得文件数据的开始的位置
		// 取得文件数据的结束的位置
		int endPos = ((file.substring(0,boundaryLocation)).getBytes()).length;
		File checkFile = new File(fileName); //检查上载文件是否存在
		if(checkFile.exists()){
			out.println("<p>" + saveFile + "文件已经存在.</p>");
		}
		File fileDir = new File(rootPath);//检查上载文件的目录是否存在
		if(!fileDir.exists()){
			fileDir.mkdirs();
		}
		fileOut = new FileOutputStream(fileName); //创建文件的写出类
		fileOut.write(dataBytes,startPos,(endPos - startPos)); //保存文件的数据
		fileOut.close();
		out.println("<P><font color=red size=5>" + saveFile + "文件成功上传.</font></p>");
	} else {
		String content = request.getContentType();
		out.println("<p>上传的数据类型不是是 multipart/form-data</p>");
	}
} catch(Exception ex) {
	throw new ServletException(ex.getMessage());
}
%>
<a href="uploadfile.jsp">继续上传文件</a>
</body>
</html>
     代码中首先获取了上传文件的相关属性信息和文件内容,然后将获取的信息转换为指定格式的文件保存在服务器上。用 request 对象获取相关信息。 然后在保存文件之前使用
    
     if(checkFile.exists())
    
    判断上传文件是否存在,使用
    
     if(!fileDir.exists())
    
    判断保存的文件目录是否存在,判断结束后,使用
    
     fileOut.write(dataBytes,startPos,(endPos-startPos))
    
    语句保存文件信息。
   
     让一个已知文件类型直接提示浏览者下载,而不是用它相关联的程序打开。以下用例子说明如何操作。创建两个 jsp 页面共同完成该功能,一个
    
     Downfile.jsp
    
    页面主要显示指定文件夹 upload 中要下载的文件对象,可以由客户选择其中之一;另一个文件
    
     Downfile1.jsp
    
    从服务器获取相关下载信息,把数据输出到客户端。
   
    
     Downfile.jsp
    
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.io.File" %>
<%@ page import="java.io.FilenameFilter" %>
<HTML>
<head><title>显示现在文件</title></head>
<body>
<center>
<h3>请选择要下载的文件</h3>
<table>
<%
    String path = request.getRealPath("/");
    File file1 = new File(path, "\\upload");
    String str[] = file1.list();
    for (int i = 0; i < str.length; i++) {
        String ss = str[i];
        out.println("<tr><td>" + ss + "</td><td><a href='Downfile1.jsp?name1=" + ss + "'>下载</a></td></tr>");
    }
%>
</table>
<center>
</body>
</HTML>
    在该文件中,使用创建的 File 对象调用
    
     list()
    
    方法,将指定文件夹 upload 中所有文件显示并可以选择下载保存。
   
    
     Downfile1.jsp
    
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.io.*" %>
<% response.reset();
try {
    String str = request.getParameter("name1"); //获得响应客户的输出流:
    str = new String(str.getBytes("iso8859-1"), "gb2312");
    String path = request.getRealPath("/");
    path = path.substring(0, path.lastIndexOf("\\"));
    path = path + "\\upload\\";
    File fileLoad = new File(path, str);//下载文件位置:
    response.reset();
    OutputStream o = response.getOutputStream();
    BufferedOutputStream bos = new BufferedOutputStream(o);
    byte b[] = new byte[500]; //输出文件用的字节数组,每次发送 500 个字节到输出流:
    response.setHeader("Content-disposition", "attachment;filename=" + new
            String(str.getBytes("gb2312"), "iso8859-1")); //客户使用保存文件的对话框
    response.setContentType("application/x-tar");//通知客户文件的 MIME 类型:
    long fileLength = fileLoad.length();//通知客户文件的长度:
    String length = String.valueOf(fileLength);
    response.setHeader("Content_Length", length);
    FileInputStream in = new FileInputStream(fileLoad);//读取文件,并发送给客户下载:
    int n = 0;
    while ((n = in.read(b)) != -1) {
        bos.write(b, 0, n);
    }
    bos.close();
} catch (Exception e) {
    System.out.print(e);
}
response.reset();
%>
    
    
    7.6 使用jspSmartUpload上传包
   
     首先介绍如何安装所需的包,从网站上下载
    
     jspsmartupload.jar
    
    这个文件,将此文件放到网站
    
     WEB-INF\lib
    
    的文件夹下,接下来就可以在JSP网页当中使用此包。
    
    在网页当中引用包的时候,必须以下式将其载入:
    
    
     <%@page import="com.jspsmart.upload.*" %>
    
上传文件的类是一种JavaBean组件,在使用前要先实例化,代码如下:
<jsp:useBean id="theSmartUpload" class="com.jspsmart.upload.SmartUpload" />
这段语法声明网页当中将以id值theSmartUpload为名称,引用SmartUpload这个组件,进行文件上传操作。
jspSmartUpload提供了相当丰富的功能,其中最简单的方式便是引用SmartUpload类的方法成员,其中包含了3个步骤:初始化、上传和存储文件。
    
    
    1、初始化SmartUpload对象
   
     在引用SmartUpload之前,必须对其进行初始化,方法
    
     initialize()
    
    用来完成初始化操作,语法如下(其中的theSmartUpload为SmartUpload的名称,pageContext则是初始化过程所需的对象):
    
    
    
     theSmartUpload.initialize(pageContext) ;
    
     初始化完成之后,就可以开始准备上传文件的操作。在此之前,还必须引用
    
     setTotalMaxFileSize()
    
    方法,设置所允许的文件大小,下面的程序代码设置一个最大为10MB的上传限制。
    
    
    
     theSmartUpload.setTotalMaxFileSize(10*1024*1024) ;
    
    
    
    2、上传
   
    初始化完成之后,紧接着直接调用
    
     upload()
    
    ,开始进行上传操作,其语法如下:
    
     theSmartUpload.upload() ;
    
需要注意的是,这个方法没有任何参数,它将表单上所有指定的文件直接上传。
    
    
    3、存储文件
   
     存储文件是上传的最后一个步骤,
    
     save()
    
    用来指定上传之后文件所要保存的位置,其语法如下(其中的fileSavePath代表上传之后的文件所要存储的位置):
    
    
    
     fileCount=theSmartUpload.save(fileSavePath) ;
    
    
    
     save()
    
    方法完成文件的存储工作之后,便会返回一个表示上传文件数目的整数值,上式的fileCount用来存储这个值。
   
     了解相关的基础用法,接下来要说明上传文件的表单,通常必须提供一个文件地址框,让用户输入所要上传的文件名称及完整路径,然后进行上传。一般来说,HTML文件输入方块标签,便可以提供所需的功能,如:
    
     <input type=file name=File1 size=50 />
    
     最后必须注意的是,用来容纳文件标签的表单,其编码格式必须设置为
    
     multipart/form-data
    
    ,才能在文件传输的过程中进行正确的编码,如:
    
     <form action=actionpage enctype="multipart/form-data" >
    
【例7-6】现在来看看一个简单的范例,其中演示了最简单的文件上传功能(注:该代码运行前需要在C盘上创建upload文件夹)
    文件上传(
    
     FileUpload.html
    
    )代码如下:
   
<html>
<head>
    <title>jspSmartUpload</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
upload file<br>
<form action="upload.jsp" method="post" enctype="multipart/form-data">
    <table>
        <tr>
            <td>name:
                <input type="file" name="file2" size="20"></td>
        </tr>
        <tr>
            <td><input type="submit" value="上传"></td>
        </tr>
    </table>
</form>
</body>
</html>
upload.jsp 代码如下:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<%@ page import="com.jspsmart.upload.*" %>
<jsp:useBean id="mySmartUpload" scope="page" class="com.jspsmart.upload.SmartUpload"/>
<html>
<head>
    <title>上载附件 </title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%  //上载附件
    try {
        mySmartUpload.initialize(pageContext);
        mySmartUpload.service(request, response);
        mySmartUpload.upload();
        String fn = mySmartUpload.getFiles().getFile(0).getFileName();
        mySmartUpload.save("c:\\upload");//文件保存的目录为 upload
        out.println("已经成功上传了文件");
    } catch (Exception e) {%><a href=FileUpload.html>重新上传</a><%
        e.printStackTrace();
    }
%>
<a href=FileUpload.html>继续上传</a>
</body>
</html>
    
    
    7.7 使用Commons-FileUpload上传包
   
Commons FileUpload提供了相当丰富的功能,其中最简单的方式便是采用以下方法进行文件的操作。
- 
     DiskFileItemFactory:设置磁盘空间,保存临时文件。这只是一个具类。
 
 
 DiskFileItemFactory factory=new DiskFileItemFactory();
 
- 
     ServletFileUpload:文件上传的核心类,此类接收request,并解析reqeust。
 
 
 ServletFileUpload upload=new ServletFileUpload(factory);
 
- 
     进行文件解析后放在List中,因为这个类库支持多个文件上传,因此会把结果保存在List中。
 
 
 List<FileItem>fileList=upload.parseRequest(request);
 
- 
     获取上传文件,进行分析。
 
 
 File remoteFile = new File(new String(fileItem.getName().getBytes(),"UTF-8"));
 
 
