在网上找到个好东东介绍实现JSP后台文件管理的,就是Web端浏览器实现类似文件管理的功能(多了上传文件)。有源代码提供,就是写得乱了点。经整理改进,增加了文件下载功能,以及对大文件上传的支持(用commons.fileupload包,解决了smartupload包传输大文件就报错的Bug)。不过还没改下载(有时间改过来)。现在与大家分享一下,欢迎大家给出建议。
对JSP后台文件管理源代码的分析就讲到这里。
- <%-- 根据oddWorld 网站文件管理系统(简体中文版)修改
- copy right by joard Ast,kliis
- admin.jsp 功能:网站文件后台管理页面。
- admin.jsp 特点:单页面实现服务器后台文件的各项管理
- 转载敬请注明出处!
- --%>
- <%@ page contentType="text/html;charset=gb2312" %>
- <%@ page import="java.io.*" %>
- <%@ page import="org.apache.commons.fileupload.*" %>
- <%@ page import="java.util.Date" %>
- <%@ page import="java.util.*" %>
- <%@ page import="com.jspsmart.upload.SmartUpload" %>
- <%@ page import="javax.servlet.http.HttpSession" %>
- <%@ page import="javax.servlet.http.HttpServletRequest" %>
- <%@ page import="java.lang.reflect.*" %>
- <% //中文字符转换%>
- <%!
- public static String UnicodeToChinese(String s)
- {
- try{
- if(s==null || s.equals("")) return "";
- String newstring=null;
- newnewstring=new String(s.getBytes("ISO8859_1"),"gb2312");
- return newstring;
- }
- catch(UnsupportedEncodingException e)
- {
- return s;
- }
- }
- public static String ChineseToUnicode(String s)
- {
- try
- {
- if(s==null||s.equals("")) return "";
- String newstring=null;
- newnewstring=new String(s.getBytes("gb2312"),"ISO8859_1");
- return newstring;
- }
- catch(UnsupportedEncodingException e)
- {
- return s;
- }
- }
- public String getTime(String formats)
- {
- //取得自定义格式的时间 ("yyyyMM") ("yyyy_MM_dd_HHmmssSSS") 大S为毫秒 HH为24小时制,hh为12小时制
- return new java.text.SimpleDateFormat(formats).format(java.util.Calendar.getInstance().getTime());
- }
- %>
- <%
- //刷新问题
- response.setHeader("Pragma","No-cache");
- response.setHeader("Cache-Control","no-cache");
- response.setDateHeader("Expires", 0);
- //自定义登陆用密码和用户名
- //正确的用户名,可以另外添加连接数据库
- String username="admin";
- //正确的密码
- String userpass="admin";
- //得到系统路径,路径得到后加一杠,表示文件夹下
- ServletContext app=(ServletContext)pageContext.getServletContext();
- String strSysPath = app.getRealPath("/");
- //处理对象物理路径
- String strDealPath="";
- //显示错误信息
- String strErr="";
- //代表页面的显示状态
- //login 是显示登陆页面
- //show 是正常的显示文件信息;
- //edit 是显示编辑文件的页面;
- //editDo是编辑文件的写入操作
- //createF 是显示创建文件夹的页面;
- //createFDo 是创建文件夹的操作;
- //renameFold 是显示更改文件夹名称的页面;
- //renameFoldDo是更改文件夹名称的操作;
- //delFoldDo 是删除文件夹的操作;
- //renameFile 是显示更改文件名称的页面;
- //renameFileDo 是更改文件名称的操作;
- //delFileDo 是删除文件的操作;
- //uploadFile 是显示上传文件的页面;
- //uploadFileDo 是上传文件的操作;
- //添加的功能 uploadFile是显示下载文件的页面
- //uploadFileDo是下载文件的操作
- String strStat="login";
- //用于show 状态下显示文件的数组
- File[] fileArr=null;
- //根据传递的路径参数得到要处理对象的物理路径
- if (request.getParameter("path")==null || request.getParameter("path").equals(""))
- {
- strDealPath=strSysPath;
- //如果从网页传来的路径为空,则默认采用
- }
- else
- {
- //得到路径参数
- strDealPath=UnicodeToChinese(request.getParameter("path"));
- }
- //检查session 的值是否存在,如果不存在着显示错误信息
- //HttpSession session = request.getSession(false);
- if (session.getValue("loginIn")==null || !session.getValue("loginIn").equals("pass"))
- {
- strStat="login";
- strErr="你还没有登陆或者登陆超时,请重新登陆!";
- }
- //创建file 对象,检查目录是否存在
- File myFile=new File(strDealPath);
- //检验文件夹是否存在
- if(!myFile.exists())
- {
- strErr="你选择的文件夹不存在,请重新选择!";
- }
- //根据参数的不同,进行对应的操作
- if(request.getParameter("act")==null ||
- request.getParameter("act").equals("") ||
- request.getParameter("act").equals("login")
- )
- {
- if(request.getParameter("username")!=null && request.getParameter("userpass")!=null)
- {
- //正确的经过MD5 加密的密码
- //String userpass="OEEO99107DC8C1EE2E06666B965601EF";
- if( request.getParameter("username").equals(username)
- && (request.getParameter("userpass")).equals(userpass)
- )
- {
- session.putValue("loginIn","pass");
- response.sendRedirect(request.getRequestURI()+"?act=show");
- }
- }
- else
- {
- strStat="login";
- strErr="你还没有登陆或者登陆超时,请重新登陆!";
- }
- }
- else if(request.getParameter("act").equals("show"))
- {
- //缺省,页面正常显示文件的信息 statStat="show"
- strStat="show";
- //创建文件列表数组
- fileArr=myFile.listFiles();
- }
- else if(request.getParameter("act").equals("edit"))
- {
- //编辑文件内容的页面
- //根据是否有request.getParameter("file")
- //以及相应文件是否存在,如果有,则进行编辑操作,如果没有,则显示错误提示信息
- if (!(request.getParameter("file")==null || request.getParameter("file").equals("")))
- {
- File fileEdit= new File(UnicodeToChinese(request.getParameter("path"))
- +UnicodeToChinese(request.getParameter("file")));
- if(fileEdit.exists())
- //文件编辑操作,实际就是更改页面的显示,用一个textarea 显示文件的信息,来做编辑
- strStat="edit";
- else
- //显示错误信息
- strErr="你选择的文件不存在,请重新选择!";
- }else
- {
- strErr="你没有选择要编辑的文件,请重新选择!";
- }
- }else if(request.getParameter("act").equals("editDo"))
- {
- //把修改的内容写入文件,并且返回修改页面
- if (!(request.getParameter("file")==null || request.getParameter("file").equals("")))
- {
- File fileEdit= new File(UnicodeToChinese(request.getParameter("path"))
- +UnicodeToChinese(request.getParameter("file")));
- if(fileEdit.exists())
- {
- //文件编辑操作,实际就是在修改文件内容以后,再于页面上用一个textarea 显示文件的内容,
- //继续来做编辑或者查看修改的效果
- if(!(request.getParameter("fileData")==null))
- {
- try{
- PrintWriter pwEdit =null;
- pwEdit=new PrintWriter(new FileOutputStream(UnicodeToChinese(request.getParameter("path"))
- +UnicodeToChinese(request.getParameter("file"))));
- pwEdit.println(UnicodeToChinese(request.getParameter("fileData")));
- pwEdit.close();
- response.sendRedirect(request.getRequestURI()+"?path="+
- UnicodeToChinese(request.getParameter("path")) +"&file="+UnicodeToChinese(request.getParameter("file")) +"&act=edit");
- return;
- }catch(Exception e)
- {
- strErr="文件写入错误,请重新选择!";
- }
- }
- else
- {
- strErr="缺少修改文件内容的参数,请重新选择!";
- }
- }else
- //显示错误信息
- strErr="你选择的文件不存在,请重新选择!";
- }else
- {
- strErr="你没有选择要编辑的文件,请重新选择!";
- }
- }else if(request.getParameter("act").equals("createF"))
- {
- //创建新的文件夹的页面显示
- strStat="createF";
- }else if(request.getParameter("act").equals("createFDo"))
- {
- //创建新的文件夹
- String strFoldName=strDealPath+UnicodeToChinese(request.getParameter("foldName")).trim()+"\\";
- //out.println(strFoldName);
- //out.close();
- File fileCreateF=new File(strFoldName);
- if(!fileCreateF.exists())
- {
- try{
- fileCreateF.mkdir();
- response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");
- return;
- }catch(Exception e)
- {
- strErr="创建新文件夹失败!";
- }
- }
- else
- {
- strErr="指定的文件夹名称和现有的文件夹名称重复,请重新指定一个新的文件夹名称!";
- }
- }
- else if(request.getParameter("act").equals("delFoldDo"))
- {
- //删除操作
- try{
- String strFileDelF=strDealPath+UnicodeToChinese(request.getParameter("fold"))+"\\";
- File fileDelF=new File(strFileDelF);
- if(fileDelF.exists())
- {
- File[] fileArrCheck=fileDelF.listFiles();
- if(!(fileArrCheck.length>0))
- {
- fileDelF.delete();
- response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");
- return;
- }else
- {
- strErr="文件夹下面还包含着文件,请把文件都删除,再删除文件夹";
- }
- }else
- {
- strErr="要删除的文件夹不存在,请重新选择";
- }
- }catch(Exception e)
- {
- strErr="文件夹删除操作错误!";
- }
- }
- else if(request.getParameter("act").equals("renameFold"))
- {
- strStat="renameFold";
- }
- else if(request.getParameter("act").equals("renameFoldDo"))
- {
- //文件夹更名操作
- //根据参数判断是否对于文件夹名称有更改动作发生
- if(request.getParameter("changeDo").equals("true"))
- {
- //有文件名,更名发生
- try{
- String strFileRenameF=strDealPath+UnicodeToChinese(request.getParameter("fold"))+"\\";
- File fileRenameF=new File(strFileRenameF);
- //先用strFileRenameF获得当前的文件路径
- String strFileRenameToF=strDealPath+UnicodeToChinese(request.getParameter("newFoldName"))+"\\";
- File fileRenameToF=new File(strFileRenameToF);
- //判断更名的文件夹是否存在
- if(fileRenameF.exists())
- {
- //判断新的文件夹名称是否与现存的文件夹重名
- if(!fileRenameToF.exists())
- {
- fileRenameF.renameTo(fileRenameToF);
- response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");
- return;
- }else
- {
- strErr="指定的文件夹名称和现有的文件夹名称重复,请重新指定一个文件夹名称!";
- }
- }else
- {
- strErr="要更名的文件夹不存在,请重新选择";
- }
- }catch(Exception e)
- {
- strErr="文件夹更名操作错误!";
- }
- }
- }
- else if(request.getParameter("act").equals("renameFile"))
- {
- strStat="renameFile";
- }
- else if(request.getParameter("act").equals("renameFileDo"))
- {
- //文件更名操作
- //根据参数判断是否对于文件名称有更改动作发生
- if(request.getParameter("changeDo").equals("true"))
- {
- //有文件名,更名发生
- try{
- String strFileRenameFi=strDealPath+UnicodeToChinese(request.getParameter("file"));
- File fileRenameFi=new File(strFileRenameFi);
- String strFileRenameToFi=strDealPath+UnicodeToChinese(request.getParameter("newFileName"));
- File fileRenameToFi=new File(strFileRenameToFi);
- //判断更名的文件是否存在
- if(fileRenameFi.exists())
- {
- //判断新的文件名称是否与现存的文件重名
- if(!fileRenameToFi.exists())
- {
- fileRenameFi.renameTo(fileRenameToFi);
- response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");
- return;
- }else
- {
- strErr="指定的文件名称和现有的文件名称重复,请重新指定一个文件名称!";
- }
- }else
- {
- strErr="要更名的文件不存在,请重新选择";
- }
- }catch(Exception e)
- {
- strErr="文件更名操作错误!";
- }
- }
- }
- else if(request.getParameter("act").equals("delFileDo"))
- {
- //删除操作
- try{
- String strFileDelFi=strDealPath+UnicodeToChinese(request.getParameter("file"));
- File fileDelFi=new File(strFileDelFi);
- if(fileDelFi.exists())
- {
- fileDelFi.delete();
- response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");
- return;
- }
- else
- {
- strErr="要删除的文件不存在,请重新选择";
- }
- }catch(Exception e)
- {
- strErr="文件删除操作错误!";
- }
- }
- //上传文件,用到smartupload组件
- else if(request.getParameter("act").equals("uploadFile"))
- {
- strStat="uploadFile";
- }
- else if(request.getParameter("act").equals("uploadFileDo"))
- {
- %>
- <%
- //上传文件操作
- //mySmartUpload.initialize(pageContext);
- //mySmartUpload.setTotalMaxFileSize(100000000);
- //try
- //{
- // mySmartUpload.upload();
- // mySmartUpload.save(strDealPath);
- // response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");
- // return;
- //} catch (Exception e)
- //{
- // strErr="文件上传出错,请检查是否超过100M 的文件大小限制!";
- //}
- //重新用commons.fileupload包传输文件
- %>
- <%
- String type="upload";
- String fileExt=null;
- long fileSize=0;
- int count=0;
- String fileName=getTime("yyyyMMdd_HHmmssSSS");
- String dateDir=getTime("yyyyMMdd")+"/";
- String path=getServletContext().getRealPath("/")+type;
- File dir=new File(path);
- if(!dir.exists())
- {
- dir.mkdir();
- }
- pathpath=path+"/"+dateDir;
- dir=new File(path);
- if(!dir.exists())
- {
- dir.mkdir();
- }
- try{
- DiskFileUpload fu=new DiskFileUpload();
- fu.setSizeMax(1024*1024*500); // 设置允许用户上传文件大小,单位:字节
- fu.setSizeThreshold(1024); // 设置最多只允许在内存中存储的数据,单位:字节
- fu.setRepositoryPath("C:\\");
- //设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的临时文件夹
- List fileItems=fu.parseRequest(request); //开始读取上传信息
- Iterator iter=fileItems.iterator(); // 依次处理每个上传的文件
- while(iter.hasNext())
- {
- FileItem item=(FileItem) iter.next();
- if(!item.isFormField())
- {
- //判断是否是文件框,忽略其他不是文件域的所有表单信息
- count++;
- fileExt=item.getName();
- //取得文件名,是客户端的文件路径,晕
- fileSize=item.getSize();
- if(fileExt==null||fileExt.equals("")||fileSize==0)
- out.print(count+" : <hr size=1>");
- else
- {
- fileExtfileExt=fileExt.substring(fileExt.lastIndexOf("\\")+1);
- //取文件扩展名
- File files=new File(path,fileExt);
- item.write(files);
- //以时间命名
- out.print(count+" : "+files.getName()+"<hr size=1>");
- response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");
- //out.print(fileExt);
- }
- }
- }
- }catch(Exception e){
- out.print("Error!");
- }
- }
- else if(request.getParameter("act").equals("downloadFile"))
- {
- strStat="downloadFile";
- }
- else if(request.getParameter("act").equals("downloadFileDo"))
- {
- %>
【编辑推荐】