JavaServlet的文件上传和下载实现方法

  • 先分析一下上传文件的流程

    1-先通过前段页面中的选择文件选择要上传的图片

    index.jsp

    XML/HTML Code 复制内容到剪贴板
    1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"  
    2.  contentType="text/html; charset=UTF-8"%>  
    3.     
    4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    5. <html>  
    6.  <head>  
    7.   <title>My JSP 'index.jsp' starting page</title>  
    8.   <meta http-equiv="content-type" content="text/html;charset=utf-8">  
    9.   <meta http-equiv="pragma" content="no-cache">  
    10.   <meta http-equiv="cache-control" content="no-cache">  
    11.   <meta http-equiv="expires" content="0">  
    12.   <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
    13.   <meta http-equiv="description" content="This is my page">  
    14.       
    15.   <script type="text/javascript" src="js/jquery.min.js"></script>  
    16.   <script type="text/javascript" src="js/common.js"></script>  
    17.   <script type="text/javascript" src="js/ajaxfileupload.js"></script>  
    18.  </head>  
    19.  <body>  
    20.   <input type="file" value="上传" name="inputImage" id="inputImage">  
    21.   <input type="button" value="上传" id="upload">  
    22.       
    23.   <a id="downLoad">下载</a>  
    24.  </body>  
    25. </html>  

    2-点击提交按钮,通过ajax的文件上传访问服务器端

    common.js  

    JavaScript Code 复制内容到剪贴板
    1. var path = (function() {   
    2.  //获取当前网址   
    3.  var curWwwPath = window.document.location.href;   
    4.  //获取主机地址之后的目录   
    5.  var pathName = window.document.location.pathname;   
    6.  var pos = curWwwPath.indexOf(pathName);   
    7.  //获取主机地址   
    8.  var localhostPath = curWwwPath.substring(0, pos);   
    9.  //获取带"/"的项目名   
    10.  var projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1);   
    11.  return {   
    12.    curWwwPath: curWwwPath,   
    13.    pathName: pathName,   
    14.    localhostPath: localhostPath,   
    15.    projectName: projectName,   
    16.    //部署路径   
    17.    deployPath: localhostPath + projectName   
    18.   };   
    19. })();   
    JavaScript Code 复制内容到剪贴板
    1. // 文件下载   
    2. $("a[id=downLoad]").click(function(){   
    3.  window.location.href=path.deployPath+"/fileDown";   
    4. });   
    5. // 文件上传   
    6. $("input[id=upload]").click(function() {   
    7.  $.ajaxFileUpload( {   
    8.   url : path.deployPath + "/fileUp"// 处理页面的绝对路径   
    9.   fileElementId : "inputImage"//file空间的id属性   
    10.   dataType : "json",   
    11.   success : function(data) {   
    12.    alert("上传成功");   
    13.   }   
    14.  });   
    15. });   

    3-服务器端响应保存或者下载

    保存上传文件的FileUpload.java

    Java Code 复制内容到剪贴板
    1. import java.io.File;   
    2. import java.io.IOException;   
    3. import java.io.PrintWriter;   
    4. import java.util.ArrayList;   
    5. import java.util.List;   
    6. import java.util.UUID;   
    7. import javax.servlet.ServletException;   
    8. import javax.servlet.http.HttpServlet;   
    9. import javax.servlet.http.HttpServletRequest;   
    10. import javax.servlet.http.HttpServletResponse;   
    11. import net.sf.json.JSONArray;   
    12. import org.apache.commons.fileupload.FileItem;   
    13. import org.apache.commons.fileupload.FileUploadException;   
    14. import org.apache.commons.fileupload.disk.DiskFileItemFactory;   
    15. import org.apache.commons.fileupload.servlet.ServletFileUpload;   
    16. import com.stu.util.HttpUtil;   
    17. /**  
    18.  * 文件名称: com.stu.fileupload.FileUpload.java<br/>  
    19.  * 初始作者: Administrator<br/>  
    20.  * 创建日期: 2018-1-31<br/>  
    21.  * 功能说明: 文件上传 <br/>  
    22.  * =================================================<br/>  
    23.  * 修改记录:<br/>  
    24.  * 修改作者 日期 修改内容<br/>  
    25.  * ================================================<br/>  
    26.  * Copyright (c) 2010-2011 .All rights reserved.<br/>  
    27.  */  
    28. public class FileUpload extends HttpServlet {   
    29.  private static final long serialVersionUID = 1L;   
    30.  @Override  
    31.  protected void service(HttpServletRequest req, HttpServletResponse res)   
    32.  throws ServletException, IOException {   
    33.   // 获取到当前服务器所在的路径   
    34.   String serverPath = req.getSession().getServletContext().getRealPath("/");   
    35.   // 设置保存上传文件的路径   
    36.   String saveDirPath = serverPath + "img";   
    37.   File saveDirPathFileObj = new File(saveDirPath);   
    38.   // 如果当用来存放文件的目录不存在时,要创建该目录   
    39.   if (!saveDirPathFileObj.exists()) {   
    40.    saveDirPathFileObj.mkdirs();   
    41.   }   
    42.   // 创建一个解析器工厂   
    43.   DiskFileItemFactory factory = new DiskFileItemFactory();   
    44.   // 设置工厂的缓存区大小   
    45.   factory.setSizeThreshold(5 * 1024);   
    46.   // 文件上传的解析器(文件上传对象)   
    47.   ServletFileUpload upload = new ServletFileUpload(factory);   
    48.   // 设置上传文件的最大值   
    49.   upload.setSizeMax(3 * 1024 * 1024);   
    50.   // 设置编码格式   
    51.   upload.setHeaderEncoding("UTF-8");   
    52.   try {   
    53.    // 上传以后的文件名   
    54.    List<String> uploadFileNames = new ArrayList<String>();   
    55.    List<FileItem> fileItems = upload.parseRequest(req);   
    56.    System.out.println(fileItems);   
    57.    for (FileItem file : fileItems) {   
    58.     // 新的文件名   
    59.     String saveFileName = UUID.randomUUID().toString().replace("-""");   
    60.     // 文件的后缀   
    61.     String oldFileName = new String(file.getName().getBytes(),   
    62.     "UTF-8");   
    63.     System.out.println("oldFileName" + oldFileName);   
    64.     String fileType = oldFileName.substring(oldFileName.lastIndexOf("."));   
    65.     // 新的文件路径   
    66.     String saveFilePath = saveDirPath + File.separator   
    67.     + saveFileName + fileType;   
    68.     uploadFileNames.add(saveFileName + fileType);   
    69.     // 保存上传的文件   
    70.     file.write(new File(saveFilePath));   
    71.    }   
    72.    System.out.println(uploadFileNames);   
    73.    HttpUtil.setAttribute(req, "urls", uploadFileNames);   
    74.    res.setContentType("application/json;charset=utf-8");   
    75.    PrintWriter pw = res.getWriter();   
    76.    pw.print(JSONArray.fromObject(uploadFileNames));   
    77.   } catch (FileUploadException e) {   
    78.    e.printStackTrace();   
    79.   } catch (Exception e) {   
    80.    e.printStackTrace();   
    81.   }   
    82.  }   
    83. }   

    下载文件的FileDownload.java

    Java Code 复制内容到剪贴板
    1. import java.io.File;   
    2. import java.io.IOException;   
    3. import java.io.PrintWriter;   
    4. import java.util.ArrayList;   
    5. import java.util.List;   
    6. import java.util.UUID;   
    7. import javax.servlet.ServletException;   
    8. import javax.servlet.http.HttpServlet;   
    9. import javax.servlet.http.HttpServletRequest;   
    10. import javax.servlet.http.HttpServletResponse;   
    11. import net.sf.json.JSONArray;   
    12. import org.apache.commons.fileupload.FileItem;   
    13. import org.apache.commons.fileupload.FileUploadException;   
    14. import org.apache.commons.fileupload.disk.DiskFileItemFactory;   
    15. import org.apache.commons.fileupload.servlet.ServletFileUpload;   
    16. import com.stu.util.HttpUtil;   
    17. /**  
    18.  * 文件名称: com.stu.fileupload.FileUpload.java<br/>  
    19.  * 初始作者: Administrator<br/>  
    20.  * 创建日期: 2018-1-31<br/>  
    21.  * 功能说明: 文件上传 <br/>  
    22.  * =================================================<br/>  
    23.  * 修改记录:<br/>  
    24.  * 修改作者 日期 修改内容<br/>  
    25.  * ================================================<br/>  
    26.  * Copyright (c) 2010-2011 .All rights reserved.<br/>  
    27.  */  
    28. public class FileUpload extends HttpServlet {   
    29.  private static final long serialVersionUID = 1L;   
    30.  @Override  
    31.  protected void service(HttpServletRequest req, HttpServletResponse res)   
    32.  throws ServletException, IOException {   
    33.   // 获取到当前服务器所在的路径   
    34.   String serverPath = req.getSession().getServletContext().getRealPath("/");   
    35.   // 设置保存上传文件的路径   
    36.   String saveDirPath = serverPath + "img";   
    37.   File saveDirPathFileObj = new File(saveDirPath);   
    38.   // 如果当用来存放文件的目录不存在时,要创建该目录   
    39.   if (!saveDirPathFileObj.exists()) {   
    40.    saveDirPathFileObj.mkdirs();   
    41.   }   
    42.   // 创建一个解析器工厂   
    43.   DiskFileItemFactory factory = new DiskFileItemFactory();   
    44.   // 设置工厂的缓存区大小   
    45.   factory.setSizeThreshold(5 * 1024);   
    46.   // 文件上传的解析器(文件上传对象)   
    47.   ServletFileUpload upload = new ServletFileUpload(factory);   
    48.   // 设置上传文件的最大值   
    49.   upload.setSizeMax(3 * 1024 * 1024);   
    50.   // 设置编码格式   
    51.   upload.setHeaderEncoding("UTF-8");   
    52.   try {   
    53.    // 上传以后的文件名   
    54.    List<String> uploadFileNames = new ArrayList<String>();   
    55.    List<FileItem> fileItems = upload.parseRequest(req);   
    56.    System.out.println(fileItems);   
    57.    for (FileItem file : fileItems) {   
    58.     // 新的文件名   
    59.     String saveFileName = UUID.randomUUID().toString().replace("-""");   
    60.     // 文件的后缀   
    61.     String oldFileName = new String(file.getName().getBytes(),   
    62.     "UTF-8");   
    63.     System.out.println("oldFileName" + oldFileName);   
    64.     String fileType = oldFileName.substring(oldFileName.lastIndexOf("."));   
    65.     // 新的文件路径   
    66.     String saveFilePath = saveDirPath + File.separator   
    67.     + saveFileName + fileType;   
    68.     uploadFileNames.add(saveFileName + fileType);   
    69.     // 保存上传的文件   
    70.     file.write(new File(saveFilePath));   
    71.    }   
    72.    System.out.println(uploadFileNames);   
    73.    HttpUtil.setAttribute(req, "urls", uploadFileNames);   
    74.    res.setContentType("application/json;charset=utf-8");   
    75.    PrintWriter pw = res.getWriter();   
    76.    pw.print(JSONArray.fromObject(uploadFileNames));   
    77.   } catch (FileUploadException e) {   
    78.    e.printStackTrace();   
    79.   } catch (Exception e) {   
    80.    e.printStackTrace();   
    81.   }   
    82.  }   
    83. }   

    这里面用到了一个HttpUtil类,代码如下:

    Java Code 复制内容到剪贴板
    1. import javax.servlet.FilterConfig;   
    2. import javax.servlet.ServletConfig;   
    3. import javax.servlet.ServletContext;   
    4. import javax.servlet.http.HttpServletRequest;   
    5. import javax.servlet.http.HttpSession;   
    6. /**  
    7.  * 文件名称_com.niit.model2.util.Httputil.java</br>  
    8.  * 初始作逯ܿAdministrator</br>  
    9.  * 创建日期_2018-1-23</br>  
    10.  * 功能说明_这里用一句话描述这个类的作用--此句话需删除 <br/>  
    11.  * =================================================<br/>  
    12.  * 修改记录_br/>  
    13.  * 修改作迠日期 修改内容<br/>  
    14.  * ================================================<br/>  
    15.  * Copyright (c) 2010-2011 .All rights reserved.<br/>  
    16.  */  
    17. public class HttpUtil {   
    18.   private HttpUtil() {   
    19.   }   
    20.   /**  
    21.    * 方法描述: [用于向不同的作用域存放属性]</br>  
    22.    * 初始作迺 Administrator<br/>  
    23.    * 创建日期: 2018-1-23-上午11:24:45<br/>  
    24.    * 弿Nj版本: 2.0.0<br/>  
    25.    * =================================================<br/>  
    26.    * 修改记录_br/>  
    27.    * 修改作迠日期 修改内容<br/>  
    28.    * ================================================<br/>  
    29.    * void  
    30.    */  
    31.   public static void setAttribute(Object scopeObj, String name, Object value) {   
    32.     if (scopeObj instanceof HttpServletRequest) {   
    33.       ((HttpServletRequest) scopeObj).setAttribute(name, value);   
    34.     }   
    35.     if (scopeObj instanceof HttpSession) {   
    36.       ((HttpSession) scopeObj).setAttribute(name, value);   
    37.     }   
    38.     if (scopeObj instanceof ServletContext) {   
    39.       ((ServletContext) scopeObj).setAttribute(name, value);   
    40.     }   
    41.   }   
    42.   /**  
    43.    * 方法描述: [获取作用域中指定名称的属性思</br>  
    44.    * 初始作迺 Administrator<br/>  
    45.    * 创建日期: 2018-1-23-上午11:29:17<br/>  
    46.    * 弿Nj版本: 2.0.0<br/>  
    47.    * =================================================<br/>  
    48.    * 修改记录_br/>  
    49.    * 修改作迠日期 修改内容<br/>  
    50.    * ================================================<br/>  
    51.    *   
    52.    * @param scopeObj  
    53.    * @param name  
    54.    * @return  
    55.    *     Object  
    56.    */  
    57.   public static Object getAttribute(Object scopeObj, String name) {   
    58.     if (scopeObj instanceof HttpServletRequest) {   
    59.       return ((HttpServletRequest) scopeObj).getAttribute(name);   
    60.     }   
    61.     if (scopeObj instanceof HttpSession) {   
    62.       return ((HttpSession) scopeObj).getAttribute(name);   
    63.     }   
    64.     if (scopeObj instanceof ServletContext) {   
    65.       return ((ServletContext) scopeObj).getAttribute(name);   
    66.     }   
    67.     return null;   
    68.   }   
    69.   /**  
    70.    * 方法描述: [获取上下文对象的方法]</br>  
    71.    * 初始作迺 Administrator<br/>  
    72.    * 创建日期: 2018-1-23-上午11:31:26<br/>  
    73.    * 弿Nj版本: 2.0.0<br/>  
    74.    * =================================================<br/>  
    75.    * 修改记录_br/>  
    76.    * 修改作迠日期 修改内容<br/>  
    77.    * ================================================<br/>  
    78.    *   
    79.    * @return  
    80.    *     ServletContext  
    81.    */  
    82.   public static ServletContext getServletContext(Object sourceObj) {   
    83.     if (sourceObj instanceof HttpServletRequest) {   
    84.       return ((HttpServletRequest) sourceObj).getSession().getServletContext();   
    85.     }   
    86.     if (sourceObj instanceof ServletConfig) {   
    87.       return ((ServletConfig) sourceObj).getServletContext();   
    88.     }   
    89.     if (sourceObj instanceof FilterConfig) {   
    90.       return ((FilterConfig) sourceObj).getServletContext();   
    91.     }   
    92.     return null;   
    93.   }   
    94.   /**  
    95.    * 方法描述: [获取项目的实际路径]</br>  
    96.    * 初始作迺 Administrator<br/>  
    97.    * 创建日期: 2018-1-23-上午11:45:47<br/>  
    98.    * 弿Nj版本: 2.0.0<br/>  
    99.    * =================================================<br/>  
    100.    * 修改记录_br/>  
    101.    * 修改作迠日期 修改内容<br/>  
    102.    * ================================================<br/>  
    103.    *   
    104.    * @param req  
    105.    * @return  
    106.    *     String  
    107.    */  
    108.   public static String getContextPath(HttpServletRequest req) {   
    109.     return req.getContextPath();   
    110.   }   
    111. }   

    当然,代码编辑好了也不要忘了在 WebRoot/WEB-INF/web.xml 中添加新建的Servlet,就是刚刚的两个Java文件啦

    Java Code 复制内容到剪贴板
    1. <?xml version="1.0" encoding="UTF-8"?>   
    2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
    3.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    5.   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">   
    6.   <welcome-file-list>   
    7.     <welcome-file>index.jsp</welcome-file>   
    8.   </welcome-file-list>   
    9.   <!-- 文件上传 -->   
    10.   <servlet>   
    11.     <servlet-name>fileUpload</servlet-name>   
    12.     <servlet-class>com.stu.fileupload.FileUpload</servlet-class>   
    13.   </servlet>   
    14.   <servlet-mapping>   
    15.     <servlet-name>fileUpload</servlet-name>   
    16.     <url-pattern>/fileUp</url-pattern>   
    17.   </servlet-mapping>   
    18.   <!-- 文件下载 -->   
    19.   <servlet>   
    20.     <servlet-name>fileDownload</servlet-name>   
    21.     <servlet-class>com.stu.fileupload.FileDownload</servlet-class>   
    22.   </servlet>   
    23.   <servlet-mapping>   
    24.     <servlet-name>fileDownload</servlet-name>   
    25.     <url-pattern>/fileDown</url-pattern>   
    26.   </servlet-mapping>   
    27. </web-app>   

    这样的话就可以运行啦。

    TIP: 不要忘记相关的jar包和 js 包哦

    在 WebRoot / WEB-INF / lib 下,有 commons-fileupload.jar 和 commons-io.jar ,另外 json-lib-x.x.x-jdkxx.jar 包是用来把上传的返回数据修改为JSON格式的

    在 WebRoot / js 下,导入 jquery.js , common.js , ajaxfileupload.js

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值