Servlet上传文件
1 package pageckage; 2 3 4 5 import java.io.File; 6 import java.io.*; 7 import java.io.IOException; 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 /** 22 * 23 * @author Administrator 24 * 文件上传 25 * 具体步骤: 26 * 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包 27 * 2) 利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同 28 * 3)对 DiskFileItemFactory 对象设置一些 属性 29 * 4)高水平的API文件上传处理 ServletFileUpload upload = new ServletFileUpload(factory); 30 * 目的是调用 parseRequest(request)方法 获得 FileItem 集合list , 31 * 32 * 5)在 FileItem 对象中 获取信息, 遍历, 判断 表单提交过来的信息 是否是 普通文本信息 另做处理 33 * 6) 34 * 第一种. 用第三方 提供的 item.write( new File(path,filename) ); 直接写到磁盘上 35 * 第二种. 手动处理 36 * 37 */ 38 39 40 /** 41 * jsp 页面代码 42 <!-- enctype 默认是 application/x-www-form-urlencoded --> 43 <form action="FileUpLoad" enctype="multipart/form-data" method="post" > 44 45 用户名:<input type="text" name="usename"> <br/> 46 上传文件:<input type="file" name="file1"><br/> 47 上传文件: <input type="file" name="file2"><br/> 48 <input type="submit" value="提交"/> 49 50 </form> 51 52 */ 53 54 55 56 public class UploadServlet extends HttpServlet { 57 58 public void doPost(HttpServletRequest request, HttpServletResponse response) 59 throws ServletException, IOException { 60 61 request.setCharacterEncoding("utf-8"); //设置编码 62 63 //获得磁盘文件条目工厂 64 DiskFileItemFactory factory = new DiskFileItemFactory(); 65 //获取文件需要上传到的路径 66 String path = request.getRealPath("/upload"); 67 68 //如果没以下两行设置的话,上传大的 文件 会占用 很多内存, 69 //设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同 70 /** 71 * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 72 * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的 73 * 然后再将其真正写到 对应目录的硬盘上 74 */ 75 factory.setRepository(new File(path)); 76 //设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室 77 factory.setSizeThreshold(1024*1024) ; 78 79 //高水平的API文件上传处理 80 ServletFileUpload upload = new ServletFileUpload(factory); 81 82 83 try { 84 //可以上传多个文件 85 List<FileItem> list = (List<FileItem>)upload.parseRequest(request); 86 87 for(FileItem item : list) 88 { 89 //获取表单的属性名字 90 String name = item.getFieldName(); 91 92 //如果获取的 表单信息是普通的 文本 信息 93 if(item.isFormField()) 94 { 95 //获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的 96 String value = item.getString() ; 97 98 request.setAttribute(name, value); 99 } 100 //对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些 101 else 102 { 103 /** 104 * 以下三步,主要获取 上传文件的名字 105 */ 106 //获取路径名 107 String value = item.getName() ; 108 //索引到最后一个反斜杠 109 int start = value.lastIndexOf("\\"); 110 //截取 上传文件的 字符串名字,加1是 去掉反斜杠, 111 String filename = value.substring(start+1); 112 113 request.setAttribute(name, filename); 114 115 //真正写到磁盘上 116 //它抛出的异常 用exception 捕捉 117 118 //item.write( new File(path,filename) );//第三方提供的 119 120 //手动写的 121 OutputStream out = new FileOutputStream(new File(path,filename)); 122 123 InputStream in = item.getInputStream() ; 124 125 int length = 0 ; 126 byte [] buf = new byte[1024] ; 127 128 System.out.println("获取上传文件的总共的容量:"+item.getSize()); 129 130 // in.read(buf) 每次读到的数据存放在 buf 数组中 131 while( (length = in.read(buf) ) != -1) 132 { 133 //在 buf 数组中 取出数据 写到 (输出流)磁盘上 134 out.write(buf, 0, length); 135 136 } 137 138 in.close(); 139 out.close(); 140 } 141 } 142 143 144 145 } catch (FileUploadException e) { 146 // TODO Auto-generated catch block 147 e.printStackTrace(); 148 } 149 catch (Exception e) { 150 // TODO Auto-generated catch block 151 152 //e.printStackTrace(); 153 } 154 155 156 request.getRequestDispatcher("filedemo.jsp").forward(request, response); 157 158 159 } 160 161 }