转载

分析JSP后台文件管理源代码

在网上找到个好东东介绍实现JSP后台文件管理的,就是Web端浏览器实现类似文件管理的功能(多了上传文件)。有源代码提供,就是写得乱了点。经整理改进,增加了文件下载功能,以及对大文件上传的支持(用commons.fileupload包,解决了smartupload包传输大文件就报错的Bug)。不过还没改下载(有时间改过来)。现在与大家分享一下,欢迎大家给出建议。

  1. <%-- 根据oddWorld 网站文件管理系统(简体中文版)修改  
  2.   copy right by joard Ast,kliis   
  3.   admin.jsp 功能:网站文件后台管理页面。  
  4.   admin.jsp 特点:单页面实现服务器后台文件的各项管理  
  5.   转载敬请注明出处!  
  6. --%> 
  7.   <%@ page contentType="text/html;charset=gb2312" %> 
  8. <%@ page import="java.io.*" %> 
  9. <%@ page import="org.apache.commons.fileupload.*" %> 
  10. <%@ page import="java.util.Date" %> 
  11. <%@ page import="java.util.*" %> 
  12. <%@ page import="com.jspsmart.upload.SmartUpload" %> 
  13. <%@ page import="javax.servlet.http.HttpSession" %> 
  14. <%@ page import="javax.servlet.http.HttpServletRequest" %> 
  15. <%@ page import="java.lang.reflect.*" %> 
  16.  
  17. <% //中文字符转换%> 
  18. <%!  
  19. public static String UnicodeToChinese(String s)  
  20. {  
  21.   try{  
  22.   if(s==null || s.equals("")) return "";  
  23.   String newstring=null;  
  24.   newnewstring=new String(s.getBytes("ISO8859_1"),"gb2312");  
  25.   return newstring;  
  26.   }  
  27.   catch(UnsupportedEncodingException e)  
  28.   {  
  29.   return s;  
  30.   }  
  31. }  
  32.  
  33. public static String ChineseToUnicode(String s)  
  34. {  
  35.   try  
  36.   {  
  37.   if(s==null||s.equals("")) return "";  
  38.   String newstring=null;  
  39.   newnewstring=new String(s.getBytes("gb2312"),"ISO8859_1");  
  40.   return newstring;  
  41.   }  
  42.   catch(UnsupportedEncodingException e)  
  43.   {  
  44.   return s;  
  45.   }  
  46. }  
  47.  
  48. public String getTime(String formats)  
  49.   {    
  50.   //取得自定义格式的时间 ("yyyyMM") ("yyyy_MM_dd_HHmmssSSS") 大S为毫秒 HH为24小时制,hh为12小时制  
  51.   return new java.text.SimpleDateFormat(formats).format(java.util.Calendar.getInstance().getTime());  
  52.   }  
  53. %> 
  54.  
  55. <%  
  56. //刷新问题  
  57. response.setHeader("Pragma","No-cache");   
  58. response.setHeader("Cache-Control","no-cache");   
  59. response.setDateHeader("Expires", 0);  
  60.  
  61. //自定义登陆用密码和用户名  
  62.  
  63. //正确的用户名,可以另外添加连接数据库  
  64. String username="admin";  
  65.  
  66. //正确的密码  
  67. String userpass="admin";  
  68.  
  69. //得到系统路径,路径得到后加一杠,表示文件夹下  
  70. ServletContext app=(ServletContext)pageContext.getServletContext();  
  71. String strSysPath = app.getRealPath("/");  
  72.  
  73.  
  74. //处理对象物理路径  
  75. String strDealPath="";  
  76.  
  77. //显示错误信息  
  78. String strErr="";  
  79.  
  80. //代表页面的显示状态  
  81. //login 是显示登陆页面  
  82. //show 是正常的显示文件信息;  
  83. //edit 是显示编辑文件的页面;  
  84. //editDo是编辑文件的写入操作  
  85. //createF 是显示创建文件夹的页面;  
  86. //createFDo 是创建文件夹的操作;  
  87. //renameFold 是显示更改文件夹名称的页面;  
  88. //renameFoldDo是更改文件夹名称的操作;  
  89. //delFoldDo 是删除文件夹的操作;  
  90. //renameFile 是显示更改文件名称的页面;  
  91. //renameFileDo 是更改文件名称的操作;  
  92. //delFileDo 是删除文件的操作;  
  93. //uploadFile 是显示上传文件的页面;  
  94. //uploadFileDo 是上传文件的操作;  
  95.  
  96. //添加的功能 uploadFile是显示下载文件的页面  
  97. //uploadFileDo是下载文件的操作  
  98.  
  99. String strStat="login";  
  100. //用于show 状态下显示文件的数组  
  101.  
  102. File[] fileArr=null;  
  103. //根据传递的路径参数得到要处理对象的物理路径  
  104.  
  105. if (request.getParameter("path")==null || request.getParameter("path").equals(""))  
  106. {  
  107.   strDealPath=strSysPath;  
  108.   //如果从网页传来的路径为空,则默认采用  
  109. }  
  110. else  
  111. {  
  112.   //得到路径参数  
  113.   strDealPath=UnicodeToChinese(request.getParameter("path"));  
  114. }  
  115. //检查session 的值是否存在,如果不存在着显示错误信息  
  116. //HttpSession session = request.getSession(false);  
  117.  
  118. if (session.getValue("loginIn")==null || !session.getValue("loginIn").equals("pass"))  
  119. {   
  120.   strStat="login";  
  121.   strErr="你还没有登陆或者登陆超时,请重新登陆!";  
  122. }  
  123.  
  124. //创建file 对象,检查目录是否存在  
  125. File myFile=new File(strDealPath);  
  126.  
  127. //检验文件夹是否存在   
  128. if(!myFile.exists())  
  129. {  
  130.   strErr="你选择的文件夹不存在,请重新选择!";  
  131. }  
  132. //根据参数的不同,进行对应的操作  
  133. if(request.getParameter("act")==null ||   
  134.   request.getParameter("act").equals("") ||   
  135.   request.getParameter("act").equals("login")  
  136.   )  
  137. {  
  138.   if(request.getParameter("username")!=null && request.getParameter("userpass")!=null)  
  139.   {  
  140.  
  141.   //正确的经过MD5 加密的密码  
  142.   //String userpass="OEEO99107DC8C1EE2E06666B965601EF";  
  143.  
  144.   if( request.getParameter("username").equals(username)   
  145.   && (request.getParameter("userpass")).equals(userpass)  
  146.   )  
  147.   {  
  148.   session.putValue("loginIn","pass");  
  149.   response.sendRedirect(request.getRequestURI()+"?act=show");  
  150.   }  
  151.   }   
  152.   else  
  153.   {  
  154.   strStat="login";  
  155.   strErr="你还没有登陆或者登陆超时,请重新登陆!";  
  156.   }  
  157. }  
  158. else if(request.getParameter("act").equals("show"))  
  159. {  
  160.   //缺省,页面正常显示文件的信息 statStat="show" 
  161.   strStat="show";  
  162.  
  163.   //创建文件列表数组  
  164.   fileArr=myFile.listFiles();  
  165.  
  166. }  
  167. else if(request.getParameter("act").equals("edit"))  
  168. {  
  169.   //编辑文件内容的页面  
  170.   //根据是否有request.getParameter("file")  
  171.   //以及相应文件是否存在,如果有,则进行编辑操作,如果没有,则显示错误提示信息  
  172.      
  173.   if (!(request.getParameter("file")==null || request.getParameter("file").equals("")))  
  174.   {  
  175.  
  176.   File fileEditnew File(UnicodeToChinese(request.getParameter("path"))  
  177.   +UnicodeToChinese(request.getParameter("file")));  
  178.      
  179.   if(fileEdit.exists())  
  180.   //文件编辑操作,实际就是更改页面的显示,用一个textarea 显示文件的信息,来做编辑  
  181.   strStat="edit";  
  182.   else   
  183.   //显示错误信息  
  184.   strErr="你选择的文件不存在,请重新选择!";  
  185.      
  186.   }else  
  187.   {  
  188.   strErr="你没有选择要编辑的文件,请重新选择!";  
  189.   }  
  190. }else if(request.getParameter("act").equals("editDo"))  
  191. {  
  192.   //把修改的内容写入文件,并且返回修改页面  
  193.   if (!(request.getParameter("file")==null || request.getParameter("file").equals("")))  
  194.   {   
  195.   File fileEditnew File(UnicodeToChinese(request.getParameter("path"))  
  196.   +UnicodeToChinese(request.getParameter("file")));  
  197.  
  198.   if(fileEdit.exists())  
  199.   {   
  200.   //文件编辑操作,实际就是在修改文件内容以后,再于页面上用一个textarea 显示文件的内容,  
  201.   //继续来做编辑或者查看修改的效果  
  202.   if(!(request.getParameter("fileData")==null))  
  203.   {   
  204.   try{  
  205.   PrintWriter pwEdit =null;  
  206.      
  207.   pwEdit=new PrintWriter(new FileOutputStream(UnicodeToChinese(request.getParameter("path"))  
  208.   +UnicodeToChinese(request.getParameter("file"))));  
  209.      
  210.   pwEdit.println(UnicodeToChinese(request.getParameter("fileData")));  
  211.   pwEdit.close();  
  212.      
  213.   response.sendRedirect(request.getRequestURI()+"?path="+   
  214.   UnicodeToChinese(request.getParameter("path")) +"&file="+UnicodeToChinese(request.getParameter("file")) +"&act=edit");   
  215.   return;  
  216.   }catch(Exception e)  
  217.   {  
  218.   strErr="文件写入错误,请重新选择!";  
  219.   }  
  220.   }   
  221.   else  
  222.   {  
  223.   strErr="缺少修改文件内容的参数,请重新选择!";  
  224.   }  
  225.   }else   
  226.   //显示错误信息  
  227.   strErr="你选择的文件不存在,请重新选择!";  
  228.   }else  
  229.   {  
  230.   strErr="你没有选择要编辑的文件,请重新选择!";  
  231.   }  
  232. }else if(request.getParameter("act").equals("createF"))  
  233. {  
  234.   //创建新的文件夹的页面显示  
  235.   strStat="createF";  
  236. }else if(request.getParameter("act").equals("createFDo"))  
  237. {  
  238.   //创建新的文件夹  
  239.   String strFoldName=strDealPath+UnicodeToChinese(request.getParameter("foldName")).trim()+"//";  
  240.   //out.println(strFoldName);  
  241.   //out.close();  
  242.   File fileCreateF=new File(strFoldName);  
  243.  
  244.   if(!fileCreateF.exists())  
  245.   {  
  246.   try{  
  247.   fileCreateF.mkdir();  
  248.   response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");   
  249.   return;  
  250.   }catch(Exception e)  
  251.   {   
  252.   strErr="创建新文件夹失败!";  
  253.   }  
  254.   }  
  255.   else  
  256.   {   
  257.   strErr="指定的文件夹名称和现有的文件夹名称重复,请重新指定一个新的文件夹名称!";  
  258.   }  
  259. }  
  260.  
  261. else if(request.getParameter("act").equals("delFoldDo"))  
  262. {  
  263.   //删除操作  
  264.   try{  
  265.   String strFileDelF=strDealPath+UnicodeToChinese(request.getParameter("fold"))+"//";  
  266.   File fileDelF=new File(strFileDelF);  
  267.  
  268.   if(fileDelF.exists())  
  269.   {  
  270.   File[] fileArrCheck=fileDelF.listFiles();  
  271.   if(!(fileArrCheck.length>0))  
  272.   {  
  273.   fileDelF.delete();  
  274.   response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");   
  275.   return;  
  276.   }else  
  277.   {  
  278.   strErr="文件夹下面还包含着文件,请把文件都删除,再删除文件夹";  
  279.   }  
  280.   }else  
  281.   {  
  282.   strErr="要删除的文件夹不存在,请重新选择";  
  283.   }  
  284.   }catch(Exception e)  
  285.   {  
  286.   strErr="文件夹删除操作错误!";  
  287.   }  
  288. }  
  289.  
  290.  
  291. else if(request.getParameter("act").equals("renameFold"))  
  292. {  
  293.   strStat="renameFold";  
  294. }  
  295.  
  296. else if(request.getParameter("act").equals("renameFoldDo"))  
  297. {  
  298.   //文件夹更名操作  
  299.   //根据参数判断是否对于文件夹名称有更改动作发生  
  300.   if(request.getParameter("changeDo").equals("true"))  
  301.   {  
  302.   //有文件名,更名发生  
  303.   try{  
  304.   String strFileRenameF=strDealPath+UnicodeToChinese(request.getParameter("fold"))+"//";  
  305.   File fileRenameF=new File(strFileRenameF);  
  306.      
  307.   //先用strFileRenameF获得当前的文件路径  
  308.   String strFileRenameToF=strDealPath+UnicodeToChinese(request.getParameter("newFoldName"))+"//";  
  309.      
  310.   File fileRenameToF=new File(strFileRenameToF);  
  311.  
  312.   //判断更名的文件夹是否存在  
  313.   if(fileRenameF.exists())  
  314.   {  
  315.   //判断新的文件夹名称是否与现存的文件夹重名  
  316.   if(!fileRenameToF.exists())  
  317.   {  
  318.   fileRenameF.renameTo(fileRenameToF);  
  319.   response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");   
  320.   return;  
  321.   }else  
  322.   {  
  323.   strErr="指定的文件夹名称和现有的文件夹名称重复,请重新指定一个文件夹名称!";  
  324.   }  
  325.   }else  
  326.   {  
  327.   strErr="要更名的文件夹不存在,请重新选择";  
  328.   }  
  329.  
  330.   }catch(Exception e)  
  331.   {  
  332.   strErr="文件夹更名操作错误!";  
  333.   }  
  334. }  
  335. }  
  336.  
  337. else if(request.getParameter("act").equals("renameFile"))  
  338. {  
  339.   strStat="renameFile";  
  340. }  
  341.  
  342. else if(request.getParameter("act").equals("renameFileDo"))  
  343. {  
  344.   //文件更名操作  
  345.   //根据参数判断是否对于文件名称有更改动作发生  
  346.   if(request.getParameter("changeDo").equals("true"))  
  347.   {  
  348.   //有文件名,更名发生  
  349.   try{  
  350.   String strFileRenameFi=strDealPath+UnicodeToChinese(request.getParameter("file"));  
  351.   File fileRenameFi=new File(strFileRenameFi);  
  352.      
  353.   String strFileRenameToFi=strDealPath+UnicodeToChinese(request.getParameter("newFileName"));  
  354.   File fileRenameToFi=new File(strFileRenameToFi);  
  355.      
  356.   //判断更名的文件是否存在  
  357.   if(fileRenameFi.exists())  
  358.   {  
  359.   //判断新的文件名称是否与现存的文件重名  
  360.   if(!fileRenameToFi.exists())  
  361.   {  
  362.   fileRenameFi.renameTo(fileRenameToFi);  
  363.   response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");   
  364.   return;  
  365.   }else  
  366.   {  
  367.   strErr="指定的文件名称和现有的文件名称重复,请重新指定一个文件名称!";  
  368.   }  
  369.   }else  
  370.   {  
  371.   strErr="要更名的文件不存在,请重新选择";  
  372.   }  
  373.  
  374.   }catch(Exception e)  
  375.   {  
  376.   strErr="文件更名操作错误!";  
  377.   }   
  378.   }  
  379. }  
  380.  
  381. else if(request.getParameter("act").equals("delFileDo"))  
  382. {  
  383.   //删除操作  
  384.   try{  
  385.   String strFileDelFi=strDealPath+UnicodeToChinese(request.getParameter("file"));  
  386.   File fileDelFi=new File(strFileDelFi);  
  387.  
  388.   if(fileDelFi.exists())  
  389.   {  
  390.   fileDelFi.delete();  
  391.   response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");   
  392.   return;  
  393.   }  
  394.   else  
  395.   {  
  396.   strErr="要删除的文件不存在,请重新选择";  
  397.   }  
  398.  
  399.   }catch(Exception e)  
  400.   {  
  401.   strErr="文件删除操作错误!";  
  402.   }   
  403. }  
  404.  
  405. //上传文件,用到smartupload组件  
  406. else if(request.getParameter("act").equals("uploadFile"))  
  407. {  
  408.   strStat="uploadFile";  
  409. }  
  410. else if(request.getParameter("act").equals("uploadFileDo"))  
  411. {  
  412. %> 
  413.  
  414. <%  
  415.   //上传文件操作  
  416.   //mySmartUpload.initialize(pageContext);  
  417.   //mySmartUpload.setTotalMaxFileSize(100000000);  
  418.   //try   
  419.   //{  
  420.   // mySmartUpload.upload();  
  421.   // mySmartUpload.save(strDealPath);  
  422.  
  423.   // response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");   
  424.   // return;   
  425.   //} catch (Exception e)   
  426.   //{   
  427.   // strErr="文件上传出错,请检查是否超过100M 的文件大小限制!";  
  428.   //}  
  429.      
  430.   //重新用commons.fileupload包传输文件  
  431.      
  432. %> 
  433.  
  434. <%  
  435.  
  436.   String type="upload";  
  437.  
  438.   String fileExt=null;  
  439.  
  440.   long fileSize=0;  
  441.  
  442.   int count=0;  
  443.  
  444.   String fileName=getTime("yyyyMMdd_HHmmssSSS");  
  445.  
  446.   String dateDir=getTime("yyyyMMdd")+"/";  
  447.  
  448.   String path=getServletContext().getRealPath("/")+type;  
  449.  
  450.   File dir=new File(path);  
  451.   if(!dir.exists())  
  452.   {   
  453.   dir.mkdir();  
  454.   }  
  455.  
  456.   pathpath=path+"/"+dateDir;    
  457.  
  458.   dir=new File(path);  
  459.      
  460.   if(!dir.exists())  
  461.   {   
  462.   dir.mkdir();  
  463.   }  
  464.   try{  
  465.  
  466.   DiskFileUpload fu=new DiskFileUpload();  
  467.  
  468.   fu.setSizeMax(1024*1024*500); // 设置允许用户上传文件大小,单位:字节  
  469.  
  470.   fu.setSizeThreshold(1024); // 设置最多只允许在内存中存储的数据,单位:字节  
  471.  
  472.   fu.setRepositoryPath("C://");    
  473.   //设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的临时文件夹  
  474.  
  475.   List fileItems=fu.parseRequest(request); //开始读取上传信息  
  476.  
  477.   Iterator iter=fileItems.iterator(); // 依次处理每个上传的文件  
  478.  
  479.   while(iter.hasNext())   
  480.   {  
  481.      
  482.   FileItem item=(FileItem) iter.next();  
  483.  
  484.   if(!item.isFormField())  
  485.   {    
  486.   //判断是否是文件框,忽略其他不是文件域的所有表单信息  
  487.   count++;  
  488.      
  489.   fileExt=item.getName();    
  490.   //取得文件名,是客户端的文件路径,晕  
  491.      
  492.   fileSize=item.getSize();  
  493.      
  494.   if(fileExt==null||fileExt.equals("")||fileSize==0)   
  495.      
  496.   out.print(count+" : <hr size=1>");   
  497.   else  
  498.   {  
  499.   fileExtfileExt=fileExt.substring(fileExt.lastIndexOf("//")+1);    
  500.   //取文件扩展名  
  501.      
  502.   File files=new File(path,fileExt);  
  503.      
  504.   item.write(files);    
  505.   //以时间命名  
  506.      
  507.   out.print(count+" : "+files.getName()+"<hr size=1>");  
  508.   response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");  
  509.   //out.print(fileExt);  
  510.      
  511.   }  
  512.   }  
  513.      
  514. }  
  515.  
  516. }catch(Exception e){  
  517.   out.print("Error!");  
  518. }  
  519.  
  520. }  
  521. else if(request.getParameter("act").equals("downloadFile"))  
  522. {  
  523.   strStat="downloadFile";  
  524.      
  525.      
  526. }  
  527. else if(request.getParameter("act").equals("downloadFileDo"))  
  528. {  
  529. %> 
对JSP后台文件管理源代码的分析就讲到这里。

正文到此结束
Loading...