首页 > 代码库 > web文件上传一学习记录 (简单的web浏览器可读文件的上传,servlet 文件上传)
web文件上传一学习记录 (简单的web浏览器可读文件的上传,servlet 文件上传)
文件上传:这里用得时表单上传的方式,表单上传到的时候 method一定指定为POST,enctype="multipart/form-data".
第一种方式,直接上传、读取、显示内容,并没有存储到服务器端。
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="http://www.mamicode.com/"> 11 12 <title>My JSP ‘fileUpLoad.jsp‘ starting page</title> 13 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="http://www.mamicode.com/styles.css"> 21 --> 22 23 </head> 24 25 <body> 26 第一种文件上传,没有设置上传路径,就只是简单的读取。 27 <!-- method="post" enctype="multipart/from-data"必须这样的 --> 28 <form action="fileUploadRest.jsp" method="post" enctype="multipart/form-data"> 29 username:<input type="text" name="username"><br> 30 file:<input type="file" name="file"><br> 31 <input type="submit" value="http://www.mamicode.com/submit"> 32 </form> 33 </body> 34 </html>
然后再第二个JSP页面中读取展示所上传的内容。
request.getInputStream();文件通过表单的方式上传的时候,再服务器端会有一个与之对应的流,可以通过request.getInputStream();获取这个流,并向普通流一样处理。
这个jsp页面也写了servlet 上传的方式。
1 <%@page import="java.io.InputStreamReader"%> 2 <%@page import="java.io.BufferedReader"%> 3 <%@page import="java.io.InputStream"%> 4 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 5 <% 6 String path = request.getContextPath(); 7 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 8 %> 9 10 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 11 <html> 12 <head> 13 <base href="http://www.mamicode.com/"> 14 15 <title>My JSP ‘fileUploadRest.jsp‘ starting page</title> 16 17 <meta http-equiv="pragma" content="no-cache"> 18 <meta http-equiv="cache-control" content="no-cache"> 19 <meta http-equiv="expires" content="0"> 20 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 21 <meta http-equiv="description" content="This is my page"> 22 <!-- 23 <link rel="stylesheet" type="text/css" href="http://www.mamicode.com/styles.css"> 24 --> 25 </head> 26 27 <body> 28 username: <%=request.getParameter("username") %><br> 29 30 <% InputStream is = request.getInputStream(); 31 BufferedReader br = new BufferedReader(new InputStreamReader(is)); 32 String buffer = null; 33 while(null!=(buffer = br.readLine())) 34 { 35 out.print(buffer + "<br>"); 36 } 37 br.close(); 38 is.close(); 39 %> 40 41 42 43 第二种方式:servlet文件上传<br> 44 <form action="FileUpload" method="post" enctype=multipart/form-data > 45 Username:<input type="text" name="filename" ><br> 46 File:<input type="file" name="file"><br> 47 File2:<input type="file" name="file2"><br> 48 <input type="submit" value="http://www.mamicode.com/submit"> 49 </form> 50 51 </body> 52 </html>
处理文件上传得Servlet
1 package servlet_p; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 import java.io.PrintWriter; 9 import java.util.List; 10 11 import javax.servlet.ServletException; 12 import javax.servlet.http.HttpServlet; 13 import javax.servlet.http.HttpServletRequest; 14 import javax.servlet.http.HttpServletResponse; 15 16 import org.apache.commons.fileupload.FileItem; 17 import org.apache.commons.fileupload.FileUploadException; 18 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 19 import org.apache.commons.fileupload.servlet.ServletFileUpload; 20 21 public class FileUpload extends HttpServlet 22 { 23 /** 24 * 文件上传用到的包 25 * comment-fileupload.jar 依赖于comment-io.jar 26 */ 27 public void doPost(HttpServletRequest request, HttpServletResponse response) 28 throws ServletException, IOException 29 { 30 //文件工厂类的实例 31 DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(); 32 String path = request.getRealPath("/upload"); 33 //setRepository设置缓冲目录(文件大于制定大小的时候存放临时文件 默认10240) 34 diskFileItemFactory.setRepository(new File(path)); 35 diskFileItemFactory.setSizeThreshold(1024*1024*10);//指定默认文件最大值 36 ServletFileUpload upload = new ServletFileUpload(diskFileItemFactory); 37 38 try 39 {//FileItem文件条目 代表一个文件或者一个表单的元素 40 List<FileItem> list = upload.parseRequest(request); 41 for(FileItem fileItem:list) 42 {//fileItem.isFormField() 是不是一个普通的表单的元素 43 //获得文件或者表单元素的名字 44 String name = fileItem.getFieldName(); 45 if(fileItem.isFormField()) 46 { 47 String value =http://www.mamicode.com/ fileItem.getString(); 48 System.out.println(name+ " " +value); 49 request.setAttribute(name, value); 50 } 51 else 52 { 53 String value=http://www.mamicode.com/fileItem.getName();//获得上传文件的名字 54 // 有的浏览器得到不仅仅有文件名,还有磁盘信息 55 // int start = value.lastIndexOf("\\"); 56 // 截取即可 57 // String fileName = value.substring(start + 1); 58 request.setAttribute(name, value); 59 60 // fileItem.write(new File(path,value));//写入到本地 61 62 //自己的方式会产生临时文件不会删除 上面的write会删掉 63 OutputStream os = new FileOutputStream(new File(path,value)); 64 InputStream is = fileItem.getInputStream(); 65 fileItem.getSize();//获得文件的总得字节数 与length 相比可获得百分比 66 int length = 0; 67 byte[] buffer = new byte[400]; 68 while(-1!=(length = is.read(buffer))) 69 { 70 os.write(buffer, 0, length); 71 } 72 os.close(); 73 is.close(); 74 System.out.println(path); 75 } 76 } 77 } catch (Exception e) 78 { 79 e.printStackTrace(); 80 } 81 request.getRequestDispatcher("fileUploadResult2.jsp").forward(request, response); 82 } 83 84 }
用到的jar包 comment-fileupload.jar comment-io.jar,文件上传时多个文件的上传与j单个文件的上传没什么大区别,只是处理的时候把所有上传的文件放到List集合里面。
上传之后转到结果页展示已上传的文件即可:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="http://www.mamicode.com/"> 11 12 <title>My JSP ‘fileUploadResult2.jsp‘ starting page</title> 13 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="http://www.mamicode.com/styles.css"> 21 --> 22 23 </head> 24 25 <body> 26 username = ${requestScope.filename}<br> 27 File =${requestScope.file} 28 File2=${requestScope.file2} 29 </body> 30 </html>
DiskFileItemFactory FileItem ServletFileUpload 这三个类是这里主要使用的类关于这三个类的介绍主要就介绍DiskFileItemFactory
DiskFileItemFactory :(转自:http://blog.csdn.net/chinaliuyan/article/details/7002016)
将请求消息实体中的每一个项目封装成单独的DiskFileItem (FileItem接口的实现) 对象的任务
由 org.apache.commons.fileupload.FileItemFactory 接口的默认实现
org.apache.commons.fileupload.disk.DiskFileItemFactory 来完成。当上传的文件项目比较小时,直接保存在内存中(速度比较快),比较大时,以临时文件的形式,保存在磁盘临时文件夹(虽然速度慢些,但是内存资源是有限的)。
属性
1) public static final int DEFAULT_SIZE_THRESHOLD :将文件保存在内存还是磁盘临时文件夹的默认临界值,值为10240,即10kb。
2) private File repository:用于配置在创建文件项目时,当文件项目大于临界值时使用的临时文件夹,默认采用系统默认的临时文件路径,可以通过系统属性 java.io.tmpdir获取。如下代码:
System.getProperty("java.io.tmpdir");
3) private int sizeThreshold:用于保存将文件保存在内存还是磁盘临时文件夹的临界值
构造方法
1) public DiskFileItemFactory()
采用默认临界值和系统临时文件夹构造文件项工厂对象。
2) public DiskFileItemFactory(int sizeThreshold,File repository)
采用参数指定临界值和系统临时文件夹构造文件项工厂对象。
3) FileItem createItem()
根据DiskFileItemFactory相关配置将每一个请求消息实体项目创建成DiskFileItem 实例,并返回。该方法从来不需要我们亲自调用,FileUpload组件在解析请求时内部使用。
4) void setSizeThreshold(int sizeThreshold)
Apache文件上传组件在解析上传数据中的每个字段内容时,需要临时保存解析出的数据,以便在后面进行数据的进一步处理(保存在磁盘特定位置或插入数据库)。因为Java虚拟机默认可以使用的内存空间是有限的,超出限制时将会抛出“java.lang.OutOfMemoryError”错误。如果上传的文件很大,例如800M的文件,在内存中将无法临时保存该文件内容,Apache文件上传组件转而采用临时文件来保存这些数据;但如果上传的文件很小,例如600个字节的文件,显然将其直接保存在内存中性能会更加好些。
setSizeThreshold方法用于设置是否将上传文件已临时文件的形式保存在磁盘的临界值(以字节为单位的int值),如果从没有调用该方法设置此临界值,将会采用系统默认值10KB。对应的getSizeThreshold() 方法用来获取此临界值。
5) void setRepository(File repository)
setRepositoryPath方法用于设置当上传文件尺寸大于setSizeThreshold方法设置的临界值时,将文件以临时文件形式保存在磁盘上的存放目录。有一个对应的获得临时文件夹的 File getRespository() 方法。
注意:当从没有调用此方法设置临时文件存储目录时,默认采用系统默认的临时文件路径,可以通过系统属性 java.io.tmpdir 获取。如下代码:
System.getProperty("java.io.tmpdir");
Tomcat系统默认临时目录为“<tomcat安装目录>/temp/”。