zoukankan      html  css  js  c++  java
  • 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参数用于以后针对不同模块上传文件到不同目录。

  • 相关阅读:
    Linux文件属性
    [Oracle] Listener的动态注册
    jQuery easyUI Pagination控件自定义div分页(不用datagrid)
    桂林电子科技大学出校流量控制器Android版1.0.0
    php使用check box
    Python windows ping
    Python selenium chrome 环境配置
    Linux wget auto login and backup database
    PyQt4 ShowHMDB show sqlite3 with QTableWidget summary
    PyQt4 py2exe 打包 HardwareManager
  • 原文地址:https://www.cnblogs.com/xiaona19841010/p/5127568.html
Copyright © 2011-2022 走看看