RandomAccessFile类提供的功能来实现文件上传。当我们想对一个文件进行读写操作时,可以创建一个指向该文件的RandomAccessFile流即可,这样既可以从这个流中读取这个文件的数据,也通过这个流写入数据给这个文件。
利用JavaBean负责将用户选择的文件上传到服务器。bean可以让内置对象request调用方法getInputStream()获得一个输入流,通过这个输入流读入客户上传的全部信息,包括文件的内容以及表单域的信息。bean可以从上传的全部信息中分离出文件的内容,并保存在服务器端。按照HTTP协议,文件表单提交的信息中,前4行和后5行市表单本身的信息,中间部分才是客户提交的文件的内容。bean通过使用RandomAccessFile流获取文件的内容,即去掉表单的信息。首先,bean将客户提交的全部信息保存为一个临时文件,该文件的名字是客户的session对象的id(不同客户的这个id是不同的),然后读取该临时文件的第2行,这一行中含有客户上传的文件的文字,获取这个名字,再获取第4行结束的位置,以及倒数第6行的结束位置,因为这两个位置之间的内容是上传文件的内容,然后将这部分内容存入文件,该文件的名字和客户上传的文件的名字保持一致。最后删除临时文件。
JSP页面中:
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="boy" size="45"><br>
<input type="submit" name="g" value="提交">
</form>
这样选择文件提交后request就会有文件流信息。
UpFile.java
package bean; import java.io.*; import javax.servlet.http.*; public class UpFile { HttpServletRequest request; HttpSession session; String upFileMessage=""; public void setRequest(HttpServletRequest request) { this.request = request; } public void setSession(HttpSession session) { this.session = session; } public String getUpFileMessage() { String fileName = null; try { String tempFileName = (String)session.getId(); //客户的session的id File f1 = new File("F://workspace//testUpLoadFile//UpFiles", tempFileName); FileOutputStream o = new FileOutputStream(f1); InputStream in = request.getInputStream(); //获取请求的字节流 byte b[] = new byte[20000]; int n; while( (n=in.read(b)) != -1) //将客户上传的全部信息存入f1 { o.write(b, 0, n); } o.close(); in.close(); RandomAccessFile random = new RandomAccessFile(f1, "r"); int second = 1; //读出f1的第2行,析取出上传文件的名字 String secondLine = null; while(second <= 2) { secondLine = random.readLine(); second++; } //获取第2行中目录符号‘/’最后出现的位置 int position = secondLine.lastIndexOf('//'); //客户上传的文件的名字是: fileName = secondLine.substring(position+1, secondLine.length()-1); //由此看出第2行最后是路径和文件名 byte cc[] = fileName.getBytes("ISO-8859-1"); //bg2312不能上传pdf,excel等文件 fileName = new String(cc); session.setAttribute("Name", fileName); //供 show.jsp页面使用 random.seek(0); //再定位到文件f1的开头 //获取第4行回车符号的位置 long forthEndPosition = 0; int forth = 1; while( (n=random.readByte())!=-1 && (forth<=4) ) //readByte()后文件指针自动向后移位 { if(n == '/n') { forthEndPosition = random.getFilePointer(); forth++; } } //根据客户上传的文件的名字,将该文件存入磁盘 File f2 = new File("F://workspace//testUpLoadFile//UpFiles", fileName); RandomAccessFile random2 = new RandomAccessFile(f2, "rw"); //确定出文件f1中包含客户上传的文件的内容的最后位置,即倒数第6行 random.seek(random.length()); long endPosition = random.getFilePointer(); long mark = endPosition; int j =1; while( (mark>=0) && (j<=6)) { mark--; random.seek(mark); n = random.readByte(); if( n== '/n') { endPosition = random.getFilePointer(); j++; } } //将random流指向文件f1的第4行结束的位置 random.seek(forthEndPosition); long startPoint = random.getFilePointer(); //从f1读出客户上传的文件存入f2(读取从第4行结束位置和倒数第6行之间的内容) while(startPoint < endPosition-1) { n = random.readByte(); random2.write(n); startPoint = random.getFilePointer(); } random2.close(); random.close(); f1.delete(); //删除临时文件 upFileMessage = fileName + "Successfully UpLoad!"; return upFileMessage; } catch(Exception exp) { if(fileName != null) { upFileMessage = fileName + "Fail to UpLoad!"; return upFileMessage; } else { upFileMessage = ""; return upFileMessage; } } } }
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ page import="bean.UpFile" %> <jsp:useBean id="upFile" class="bean.UpFile" scope="session"/> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css" mce_href="styles.css"> --> </head> <body> 选择要上传的文件:<br> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="boy" size="45"><br> <input type="submit" name="g" value="提交"> </form> <% upFile.setRequest(request); upFile.setSession(session); %> <jsp:getProperty name="upFile" property="upFileMessage"/> 如果上传的是图像文件,可单击超链接查看图像:<br> <a href="show.jsp" mce_href="show.jsp">查看图像</a> </body> </html>