JSP+Servlet实现上传下载

0.项目结构

1.在WebRoot下创建index.jsp页面

 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="<%=basePath%>">
11     
12     <title>My JSP 'index.jsp' starting page</title>
13     <meta http-equiv="pragma" content="no-cache">
14     <meta http-equiv="cache-control" content="no-cache">
15     <meta http-equiv="expires" content="0">    
16     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
17     <meta http-equiv="description" content="This is my page">
18     <!--
19     <link rel="stylesheet" type="text/css" href="styles.css">
20     -->
21   </head>
22   
23   <body>
24    <form action="UploadServlet" enctype="multipart/form-data" method="post">
25      <p>姓名:<input type="text" name="user"/></p>
26      <p>选择图片:<input type="file" name="nfile"/></p>
27      <p><input type="submit" value="提交"/></p>
28    </form>
29   </body>
30 </html>

2.在src下的com.servlet包下创建UploadServlet.java文件

  1 package com.servlet;
  2 
  3 import java.io.File;
  4 import java.io.IOException;
  5 import java.io.PrintWriter;
  6 import java.util.Arrays;
  7 import java.util.List;
  8 
  9 import javax.servlet.ServletException;
 10 import javax.servlet.http.HttpServlet;
 11 import javax.servlet.http.HttpServletRequest;
 12 import javax.servlet.http.HttpServletResponse;
 13 
 14 import org.apache.commons.fileupload.FileItem;
 15 import org.apache.commons.fileupload.FileUploadBase;
 16 import org.apache.commons.fileupload.FileUploadException;
 17 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 18 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 19 
 20 public class UploadServlet extends HttpServlet {
 21     public void doGet(HttpServletRequest request, HttpServletResponse response)
 22             throws ServletException, IOException {
 23         this.doPost(request, response);
 24     }
 25 
 26     public void doPost(HttpServletRequest request, HttpServletResponse response)
 27             throws ServletException, IOException {
 28       //1.乱码处理
 29         request.setCharacterEncoding("UTF-8");
 30         response.setCharacterEncoding("UTF-8");
 31         response.setContentType("text/html;charset=UTF-8");
 32         //创建输出流对象(负责在前台页面(写入)打印内容的)
 33         PrintWriter out=response.getWriter();
 34         
 35       //2.得知请求中的数据是否包含二进制数据
 36         boolean isMultipart=ServletFileUpload.isMultipartContent(request);
 37         
 38       //3.如果包含
 39         if(isMultipart){
 40             //3.1 创建封装表单数据的对象
 41             DiskFileItemFactory factory=new DiskFileItemFactory();
 42             
 43             //3.2 设置文件缓冲区大小4KB
 44             factory.setSizeThreshold(4096);
 45             
 46             //3.3 创建上传表单数据的对象 
 47             ServletFileUpload upload=new ServletFileUpload(factory);
 48             
 49             //3.4 设置上传单个文件的最大限制
 50             upload.setSizeMax(1024*30);
 51             
 52             try {
 53                 //3.5 解析请求中上传的表单数据,并将解析的内容的放入list集合
 54                 List<FileItem> filelist=upload.parseRequest(request);
 55                 
 56                 //3.6 循环存放表单数据的集合把普通字段和二进制字段取出来
 57                 for (FileItem f : filelist) {
 58                     //3.6.1 如果是普通字段
 59                     if(f.isFormField()){
 60                         //(1)获取普通字段的name属性值:user
 61                         String normalFiled=f.getFieldName();
 62                         
 63                         //(2)判断如果name属性值是想要的就取对应值
 64                         if(normalFiled.equals("user")){
 65                             //输出name属性所对应的value值
 66                             out.print(f.getString("UTF-8")+"上传了文件!<br/>");
 67                         }
 68                         
 69                     }else{
 70                         //3.6.2 如果是二进制文件字段
 71                         //(1)获取上传的文件名
 72                         String uploadFileName=f.getName();
 73                         
 74                         //(2)通过Arrays的aslist方法创建固定的集合,规定的文件格式
 75                         List<String> fileType=Arrays.asList("gif","bmp","jpg","png");
 76                         
 77                         //(3)返回文件的后缀
 78                         String ext=uploadFileName.substring(uploadFileName.lastIndexOf(".")+1);
 79                         
 80                         //(4)判断文件类型是否允许在制定范围
 81                         if(fileType.contains(ext)){
 82                             //(4.1)判断如果文件名不为空,将数值取出
 83                             if(uploadFileName!=null && !uploadFileName.equals("")){
 84                                 //(4.1.1)获取上传的文件路径
 85                                 String uploadFilePath=
 86                                     request.getSession().getServletContext().getRealPath("upload/");
 87                                 
 88                                 //拼接路径:第一个参数是文件夹,第二个参数是文件名
 89                                 File saveFile=new File(uploadFilePath,f.getName());
 90                                 
 91                                 //(4.1.2)上传到服务器
 92                                 f.write(saveFile);
 93                                 
 94                                 out.print("上传成功后的文件名是:"+uploadFileName+",文件大小是:"+f.getSize()+"bytes!<br/>");
 95                                 out.print("上传的文件夹路径:"+uploadFilePath+"<br/>");
 96                                 out.print("上传的文件全路径:"+saveFile.getAbsolutePath()+"<br/>");
 97                                 
 98                             }else{
 99                                 out.print("二进制文件名为空!");
100                             }
101                         }else{
102                             out.print("文件上传失败!,文件类型只能是gif.bmp,jpg,png");
103                         }
104                     }
105                 }
106                 
107             } catch (FileUploadBase.SizeLimitExceededException e) {
108                 out.print("文件上传失败,文件太大,单个文件的最大限制是:"+upload.getSizeMax()+"bytes!!") ; 
109                 e.printStackTrace();
110             } catch (FileUploadException e) {
111                 // TODO Auto-generated catch block
112                 e.printStackTrace();
113             } catch (Exception e) {
114                 // TODO Auto-generated catch block
115                 e.printStackTrace();
116             }
117             
118         }else{
119            //4.不包含
120             out.print("表单中不包含二进制数据!");
121         }
122         
123     }
124 
125 }
原文地址:https://www.cnblogs.com/holly8/p/5652614.html