• Java实现文件上传


    最近自己在做一个小系统玩的时候涉及到了文件的上传,于是在网上找到Java上传文件的方案,最后确定使用common-fileupload实现上传操作。

    • 需求说明

    用户添加页面有一个“上传”按钮,点击按钮弹出上传界面,上传完成后关闭上传界面。

    • 所需Jar包

    commons.fileupload-1.2.0.jar、commons.logging-1.1.1.jar、commons.beanutils-1.8.0.jar、commons.collections-3.2.0.jar、commons.io-1.4.0.jar、commons.lang-2.1.0.jar

    • 实现效果



    •  代码实现
    首先编写核心代码,Javascript打开上传页面,并且从上传页获取返回参数,最后数据返回给回调函数callback:
    Js代码  收藏代码
    1. /** 
    2.  * 跳转到上传页 
    3.  * functionId:功能ID 
    4.  * fileType:文件类型 
    5.  * maxSize:文件容量上限 
    6.  * callback:回调函数,返回三个参数:文件真名、文件存放名和文件大小 
    7.  */  
    8. function openUpload(functionId,fileType,maxSize,callback){  
    9.     var url = root+"/CommonController.jhtml?method=goFileUpload&";  
    10.     if(functionId!=null){  
    11.         url = url + "functionId="+functionId+"&";  
    12.     }  
    13.     if(fileType!=null){  
    14.         url = url + "fileType="+fileType+"&";  
    15.     }  
    16.     if(maxSize!=null){  
    17.         url = url + "maxSize="+maxSize;  
    18.     }  
    19.     var win = window.showModalDialog(url,"","dialogWidth:300px;dialogHeight:150px;scroll:no;status:no");  
    20.     if(win != null){  
    21.         var arrWin = win.split(",");  
    22.         callback(arrWin[0],arrWin[1],arrWin[2]);  
    23.     }  
    24. }  

      用户添加页面相关代码,点击“上传”按钮时调用上面的核心js代码,并且获取返回值

    Html代码  收藏代码
    1. <script>  
    2. .......  
    3.   
    4. function openUpload_(){  
    5.     openUpload(null,'JPG,GIF,JPEG,PNG','5',callback);  
    6. }  
    7.   
    8. /**  
    9.  * 回调函数,获取上传文件信息  
    10.  * realName真实文件名  
    11.  * saveName文件保存名  
    12.  * maxSize文件实际大小  
    13.  */  
    14. function callback(realName,saveName,maxSize){  
    15.     $("#photo_").val(saveName);  
    16.     //回调后其它操作  
    17. }  
    18. </script>  
    19.   
    20. <tr>  
    21.             <td>头像:</td>  
    22.             <td>  
    23.                 <input type="hidden" name="photo" id="photo_"></input>  
    24.                 <input type="button" onclick="openUpload_()" value="上传"/>  
    25.             </td>  
    26.         </tr>  

      文件上传的JSP代码,需要注意的是在head标签内添加<base target="_self">以防止页面跳转时弹出新窗口,用户选择指定文件,点击上传时就提交表单访问指定后台代码

    Html代码  收藏代码
    1. <%@ include file="/WEB-INF/jsp/header.jsp" %>  
    2. <%@ page language="java" contentType="text/html; charset=UTF-8"  
    3.     pageEncoding="UTF-8"%>  
    4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    5. <html>  
    6. <head>  
    7. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
    8. <meta http-equiv="pragma" content="no-cache" />  
    9. <base target="_self">  
    10. <title>文件上传</title>  
    11. </head>  
    12. <body>  
    13.     <h5>文件上传</h5><hr/>  
    14.     <form id="file_upload_id" name="file_upload_name" action="<%=root%>/CommonController.jhtml?method=doFileUpload" method="post" enctype="multipart/form-data">  
    15.         <input type="hidden" name="functionId" value="${functionId}"/>  
    16.         <input type="hidden" name="fileType" value="${fileType}"/>  
    17.         <input type="hidden" name="maxSize" value="${maxSize}"/>  
    18.         <div><input type="file" name="file_upload"/></div>  
    19.         <c:if test="${maxSize!=null}">  
    20.             <div style="font: 12">文件最大不能超过${maxSize}MB</div>  
    21.         </c:if>  
    22.         <c:if test="${fileType!=null}">  
    23.             <div style="font: 12">文件格式必须是:${fileType}</div>  
    24.         </c:if>  
    25.         <div><input type="submit" value="上传"/></div>  
    26.     </form>  
    27. </body>  
    28. </html>  

      CommonController目前有两个方法,一个是跳转到上传页面的方法,一个是执行上传操作的方法doFileUpload,上传方法运行的大概逻辑是:首先获取页面的请求参数,fileType用于限制上传文件格式,

    maxSize用于限制上传文件最大值,随后创建上传目录上传即可。

    Java代码  收藏代码
    1. public class CommonController extends BaseController {  
    2.     Log log = LogFactory.getLog(CommonController.class);  
    3.       
    4.     Properties fileUploadPro = null;  
    5.     public CommonController(){  
    6.         fileUploadPro = PropertiesUtil.getPropertiesByClass("fileupload.properties");  
    7.     }  
    8.       
    9.       
    10.     @Override  
    11.     public ModeAndView init(HttpServletRequest request,  
    12.             HttpServletResponse response) throws ServletException, IOException {  
    13.           
    14.         return null;  
    15.     }  
    16.       
    17.     /** 
    18.      * 跳转到文件上传页 
    19.      * @param request 
    20.      * @param response 
    21.      * @return 
    22.      * @throws ServletException 
    23.      * @throws IOException 
    24.      */  
    25.     public ModeAndView goFileUpload(HttpServletRequest request,  
    26.             HttpServletResponse response) throws ServletException, IOException {  
    27.         String functionId = request.getParameter("functionId");  
    28.         String fileType = request.getParameter("fileType");  
    29.         String maxSize = request.getParameter("maxSize");  
    30.         ModeAndView mav = new ModeAndView("/WEB-INF/jsp/common/fileUpload.jsp");  
    31.           
    32.         if(functionId!=null && !"".equals(functionId.trim())){  
    33.             mav.addObject("functionId", functionId);  
    34.         }  
    35.         if(fileType!=null && !"".equals(fileType.trim())){  
    36.             mav.addObject("fileType", fileType);  
    37.         }  
    38.         if(maxSize!=null && !"".equals(maxSize.trim())){  
    39.             mav.addObject("maxSize", maxSize);  
    40.         }  
    41.         return mav;  
    42.     }  
    43.       
    44.     /** 
    45.      * 上传文件 
    46.      * @param request 
    47.      * @param response 
    48.      * @return 
    49.      * @throws ServletException 
    50.      * @throws IOException 
    51.      */  
    52.     @SuppressWarnings("unchecked")  
    53.     public ModeAndView doFileUpload(HttpServletRequest request,  
    54.             HttpServletResponse response) throws ServletException, IOException {  
    55.         //获取并解析文件类型和支持最大值  
    56.         String functionId = request.getParameter("functionId");  
    57.         String fileType = request.getParameter("fileType");  
    58.         String maxSize = request.getParameter("maxSize");  
    59.           
    60.         //临时目录名  
    61.         String tempPath = fileUploadPro.getProperty("tempPath");  
    62.         //真实目录名  
    63.         String filePath = fileUploadPro.getProperty("filePath");  
    64.           
    65.         FileUtil.createFolder(tempPath);  
    66.         FileUtil.createFolder(filePath);  
    67.           
    68.         DiskFileItemFactory factory = new DiskFileItemFactory();  
    69.         //最大缓存  
    70.         factory.setSizeThreshold(5*1024);  
    71.         //设置临时文件目录  
    72.         factory.setRepository(new File(tempPath));  
    73.         ServletFileUpload upload = new ServletFileUpload(factory);  
    74.         if(maxSize!=null && !"".equals(maxSize.trim())){  
    75.             //文件最大上限  
    76.             upload.setSizeMax(Integer.valueOf(maxSize)*1024*1024);  
    77.         }  
    78.           
    79.         try {  
    80.             //获取所有文件列表  
    81.             List<FileItem> items = upload.parseRequest(request);  
    82.             for (FileItem item : items) {  
    83.                 if(!item.isFormField()){  
    84.                     //文件名  
    85.                     String fileName = item.getName();  
    86.                       
    87.                     //检查文件后缀格式  
    88.                     String fileEnd = fileName.substring(fileName.lastIndexOf(".")+1).toLowerCase();  
    89.                     if(fileType!=null && !"".equals(fileType.trim())){  
    90.                         boolean isRealType = false;  
    91.                         String[] arrType = fileType.split(",");  
    92.                         for (String str : arrType) {  
    93.                             if(fileEnd.equals(str.toLowerCase())){  
    94.                                 isRealType = true;  
    95.                                 break;  
    96.                             }  
    97.                         }  
    98.                         if(!isRealType){  
    99.                             //提示错误信息:文件格式不正确  
    100.                             super.printJsMsgBack(response, "文件格式不正确!");  
    101.                             return null;  
    102.                         }  
    103.                     }  
    104.                       
    105.                     //创建文件唯一名称  
    106.                     String uuid = UUID.randomUUID().toString();  
    107.                     //真实上传路径  
    108.                     StringBuffer sbRealPath = new StringBuffer();  
    109.                     sbRealPath.append(filePath).append(uuid).append(".").append(fileEnd);  
    110.                     //写入文件  
    111.                     File file = new File(sbRealPath.toString());  
    112.                     item.write(file);  
    113.                     //上传成功,向父窗体返回数据:真实文件名,虚拟文件名,文件大小  
    114.                     StringBuffer sb = new StringBuffer();  
    115.                     sb.append("window.returnValue='").append(fileName).append(",").append(uuid).append(".").append(fileEnd).append(",").append(file.length()).append("';");  
    116.                     sb.append("window.close();");  
    117.                     super.printJsMsg(response, sb.toString());  
    118.                     log.info("上传文件成功,JS信息:"+sb.toString());  
    119.                 }//end of if  
    120.             }//end of for  
    121.               
    122.         }catch (Exception e) {  
    123.             //提示错误:比如文件大小  
    124.             super.printJsMsgBack(response, "上传失败,文件大小不能超过"+maxSize+"M!");  
    125.             log.error("上传文件异常!",e);  
    126.             return null;  
    127.         }  
    128.           
    129.         return null;  
    130.     }  
    131. }  

      至此一个文件上传即已实现,而且能够基本满足不同模块的上传通用性,我还留着个functionId参数用于以后针对不同模块上传文件到不同目录。

  • 相关阅读:
    STL与泛型编程-练习2-GeekBand
    HashSet
    JAVA集合
    分布式锁1 Java常用技术方案
    JAVA 锁
    JAVA多线程二
    JAVA多线程一
    Redis pipeline and list
    mongo 安装
    Intersection of Two Arrays
  • 原文地址:https://www.cnblogs.com/xiaona19841010/p/5127568.html
Copyright © 2020-2023  润新知