javaweb文件的上传
文件的上传
第一步:引入jar包
第二步:文件上传页面和消息提示页面
upload.jsp页面显示
<%@ page language="java" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML> 3 <html> 4 <head> 5 <title>文件上传</title> 6 </head> 7 8 <body> 9 <form action="${pageContext.request.contextPath}/servlet/UploadHandleServlet" enctype="multipart/form-data" method="post"> 10 上传用户:<input type="text" name="username"><br/> 11 上传文件1:<input type="file" name="file1"><br/> 12 上传文件2:<input type="file" name="file2"><br/> 13 <input type="submit" value="提交"> 14 </form> 15 </body> 16 </html>
message.jsp页面
1 <%@ page language="java" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML> 3 <html> 4 <head> 5 <title>消息提示</title> 6 </head> 7 8 <body> 9 ${message} 10 </body> 11 </html>
处理文件的servlet
UploadHandleServlet的代码如下:
1 package me.gacl.web.controller; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.util.List; 8 import javax.servlet.ServletException; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 import org.apache.commons.fileupload.FileItem; 13 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 14 import org.apache.commons.fileupload.servlet.ServletFileUpload; 15 16 public class UploadHandleServlet extends HttpServlet { 17 18 public void doGet(HttpServletRequest request, HttpServletResponse response) 19 throws ServletException, IOException { 20 //得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全 21 String savePath = this.getServletContext().getRealPath("/WEB-INF/upload"); 22 File file = new File(savePath); 23 //判断上传文件的保存目录是否存在 24 if (!file.exists() && !file.isDirectory()) { 25 System.out.println(savePath+"目录不存在,需要创建"); 26 //创建目录 27 file.mkdir(); 28 } 29 //消息提示 30 String message = ""; 31 try{ 32 //使用Apache文件上传组件处理文件上传步骤: 33 //1、创建一个DiskFileItemFactory工厂 34 DiskFileItemFactory factory = new DiskFileItemFactory(); 35 //2、创建一个文件上传解析器 36 ServletFileUpload upload = new ServletFileUpload(factory); 37 //解决上传文件名的中文乱码 38 upload.setHeaderEncoding("UTF-8"); 39 //3、判断提交上来的数据是否是上传表单的数据 40 if(!ServletFileUpload.isMultipartContent(request)){ 41 //按照传统方式获取数据 42 return; 43 } 44 //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项 45 List<FileItem> list = upload.parseRequest(request); 46 for(FileItem item : list){ 47 //如果fileitem中封装的是普通输入项的数据 48 if(item.isFormField()){ 49 String name = item.getFieldName(); 50 //解决普通输入项的数据的中文乱码问题 51 String value = item.getString("UTF-8"); 52 //value = new String(value.getBytes("iso8859-1"),"UTF-8"); 53 System.out.println(name + "=" + value); 54 }else{//如果fileitem中封装的是上传文件 55 //得到上传的文件名称, 56 String filename = item.getName(); 57 System.out.println(filename); 58 if(filename==null || filename.trim().equals("")){ 59 continue; 60 } 61 //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt 62 //处理获取到的上传文件的文件名的路径部分,只保留文件名部分 63 filename = filename.substring(filename.lastIndexOf("\\")+1); 64 //获取item中的上传文件的输入流 65 InputStream in = item.getInputStream(); 66 //创建一个文件输出流 67 FileOutputStream out = new FileOutputStream(savePath + "\\" + filename); 68 //创建一个缓冲区 69 byte buffer[] = new byte[1024]; 70 //判断输入流中的数据是否已经读完的标识 71 int len = 0; 72 //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据 73 while((len=in.read(buffer))>0){ 74 //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中 75 out.write(buffer, 0, len); 76 } 77 //关闭输入流 78 in.close(); 79 //关闭输出流 80 out.close(); 81 //删除处理文件上传时生成的临时文件 82 item.delete(); 83 message = "文件上传成功!"; 84 } 85 } 86 }catch (Exception e) { 87 message= "文件上传失败!"; 88 e.printStackTrace(); 89 90 } 91 request.setAttribute("message",message); 92 request.getRequestDispatcher("/message.jsp").forward(request, response); 93 } 94 95 public void doPost(HttpServletRequest request, HttpServletResponse response) 96 throws ServletException, IOException { 97 98 doGet(request, response); 99 } 100 }
在web.xml中配置
1 <servlet> 2 <servlet-name>UploadHandleServlet</servlet-name> 3 <servlet-class>me.gacl.web.controller.UploadHandleServlet</servlet-class> 4 </servlet> 5 6 <servlet-mapping> 7 <servlet-name>UploadHandleServlet</servlet-name> 8 <url-pattern>/servlet/UploadHandleServlet</url-pattern> 9 </servlet-mapping>
注意点:
1、为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。
2、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。
3、为防止一个目录下面出现太多文件,要使用hash算法打散存储。
4、要限制上传文件的最大值。
5、要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。