分析JSP后臺文件管理源代碼
作者:xdicac
本文將分析JSP后臺文件管理源代碼,一直關(guān)注基于Web的大文件傳輸?shù)膶崿F(xiàn),嘗試用VB寫AcitveX控件在客戶端執(zhí)行FTP登錄及上傳下載。不過后來還是發(fā)現(xiàn)用JSP的方法比較好一些。
在網(wǎng)上找到個好東東介紹實現(xiàn)JSP后臺文件管理的,就是Web端瀏覽器實現(xiàn)類似文件管理的功能(多了上傳文件)。有源代碼提供,就是寫得亂了點。經(jīng)整理改進,增加了文件下載功能,以及對大文件上傳的支持(用commons.fileupload包,解決了smartupload包傳輸大文件就報錯的Bug)。不過還沒改下載(有時間改過來)?,F(xiàn)在與大家分享一下,歡迎大家給出建議。
對JSP后臺文件管理源代碼的分析就講到這里。
- <%-- 根據(jù)oddWorld 網(wǎng)站文件管理系統(tǒng)(簡體中文版)修改
- copy right by joard Ast,kliis
- admin.jsp 功能:網(wǎng)站文件后臺管理頁面。
- admin.jsp 特點:單頁面實現(xiàn)服務(wù)器后臺文件的各項管理
- 轉(zhuǎn)載敬請注明出處!
- --%>
- <%@ 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.*" %>
- <% //中文字符轉(zhuǎn)換%>
- <%!
- 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);
- //自定義登陸用密碼和用戶名
- //正確的用戶名,可以另外添加連接數(shù)據(jù)庫
- String username="admin";
- //正確的密碼
- String userpass="admin";
- //得到系統(tǒng)路徑,路徑得到后加一杠,表示文件夾下
- ServletContext app=(ServletContext)pageContext.getServletContext();
- String strSysPath = app.getRealPath("/");
- //處理對象物理路徑
- String strDealPath="";
- //顯示錯誤信息
- String strErr="";
- //代表頁面的顯示狀態(tài)
- //login 是顯示登陸頁面
- //show 是正常的顯示文件信息;
- //edit 是顯示編輯文件的頁面;
- //editDo是編輯文件的寫入操作
- //createF 是顯示創(chuàng)建文件夾的頁面;
- //createFDo 是創(chuàng)建文件夾的操作;
- //renameFold 是顯示更改文件夾名稱的頁面;
- //renameFoldDo是更改文件夾名稱的操作;
- //delFoldDo 是刪除文件夾的操作;
- //renameFile 是顯示更改文件名稱的頁面;
- //renameFileDo 是更改文件名稱的操作;
- //delFileDo 是刪除文件的操作;
- //uploadFile 是顯示上傳文件的頁面;
- //uploadFileDo 是上傳文件的操作;
- //添加的功能 uploadFile是顯示下載文件的頁面
- //uploadFileDo是下載文件的操作
- String strStat="login";
- //用于show 狀態(tài)下顯示文件的數(shù)組
- File[] fileArr=null;
- //根據(jù)傳遞的路徑參數(shù)得到要處理對象的物理路徑
- if (request.getParameter("path")==null || request.getParameter("path").equals(""))
- {
- strDealPath=strSysPath;
- //如果從網(wǎng)頁傳來的路徑為空,則默認采用
- }
- else
- {
- //得到路徑參數(shù)
- strDealPath=UnicodeToChinese(request.getParameter("path"));
- }
- //檢查session 的值是否存在,如果不存在著顯示錯誤信息
- //HttpSession session = request.getSession(false);
- if (session.getValue("loginIn")==null || !session.getValue("loginIn").equals("pass"))
- {
- strStat="login";
- strErr="你還沒有登陸或者登陸超時,請重新登陸!";
- }
- //創(chuàng)建file 對象,檢查目錄是否存在
- File myFile=new File(strDealPath);
- //檢驗文件夾是否存在
- if(!myFile.exists())
- {
- strErr="你選擇的文件夾不存在,請重新選擇!";
- }
- //根據(jù)參數(shù)的不同,進行對應(yīng)的操作
- if(request.getParameter("act")==null ||
- request.getParameter("act").equals("") ||
- request.getParameter("act").equals("login")
- )
- {
- if(request.getParameter("username")!=null && request.getParameter("userpass")!=null)
- {
- //正確的經(jīng)過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";
- //創(chuàng)建文件列表數(shù)組
- fileArr=myFile.listFiles();
- }
- else if(request.getParameter("act").equals("edit"))
- {
- //編輯文件內(nèi)容的頁面
- //根據(jù)是否有request.getParameter("file")
- //以及相應(yīng)文件是否存在,如果有,則進行編輯操作,如果沒有,則顯示錯誤提示信息
- 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"))
- {
- //把修改的內(nèi)容寫入文件,并且返回修改頁面
- if (!(request.getParameter("file")==null || request.getParameter("file").equals("")))
- {
- File fileEdit= new File(UnicodeToChinese(request.getParameter("path"))
- +UnicodeToChinese(request.getParameter("file")));
- if(fileEdit.exists())
- {
- //文件編輯操作,實際就是在修改文件內(nèi)容以后,再于頁面上用一個textarea 顯示文件的內(nèi)容,
- //繼續(xù)來做編輯或者查看修改的效果
- 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="缺少修改文件內(nèi)容的參數(shù),請重新選擇!";
- }
- }else
- //顯示錯誤信息
- strErr="你選擇的文件不存在,請重新選擇!";
- }else
- {
- strErr="你沒有選擇要編輯的文件,請重新選擇!";
- }
- }else if(request.getParameter("act").equals("createF"))
- {
- //創(chuàng)建新的文件夾的頁面顯示
- strStat="createF";
- }else if(request.getParameter("act").equals("createFDo"))
- {
- //創(chuàng)建新的文件夾
- 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="創(chuàng)建新文件夾失敗!";
- }
- }
- else
- {
- strErr="指定的文件夾名稱和現(xiàn)有的文件夾名稱重復(fù),請重新指定一個新的文件夾名稱!";
- }
- }
- 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"))
- {
- //文件夾更名操作
- //根據(jù)參數(shù)判斷是否對于文件夾名稱有更改動作發(fā)生
- if(request.getParameter("changeDo").equals("true"))
- {
- //有文件名,更名發(fā)生
- 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())
- {
- //判斷新的文件夾名稱是否與現(xiàn)存的文件夾重名
- if(!fileRenameToF.exists())
- {
- fileRenameF.renameTo(fileRenameToF);
- response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");
- return;
- }else
- {
- strErr="指定的文件夾名稱和現(xiàn)有的文件夾名稱重復(fù),請重新指定一個文件夾名稱!";
- }
- }else
- {
- strErr="要更名的文件夾不存在,請重新選擇";
- }
- }catch(Exception e)
- {
- strErr="文件夾更名操作錯誤!";
- }
- }
- }
- else if(request.getParameter("act").equals("renameFile"))
- {
- strStat="renameFile";
- }
- else if(request.getParameter("act").equals("renameFileDo"))
- {
- //文件更名操作
- //根據(jù)參數(shù)判斷是否對于文件名稱有更改動作發(fā)生
- if(request.getParameter("changeDo").equals("true"))
- {
- //有文件名,更名發(fā)生
- 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())
- {
- //判斷新的文件名稱是否與現(xiàn)存的文件重名
- if(!fileRenameToFi.exists())
- {
- fileRenameFi.renameTo(fileRenameToFi);
- response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");
- return;
- }else
- {
- strErr="指定的文件名稱和現(xiàn)有的文件名稱重復(fù),請重新指定一個文件名稱!";
- }
- }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); // 設(shè)置允許用戶上傳文件大小,單位:字節(jié)
- fu.setSizeThreshold(1024); // 設(shè)置最多只允許在內(nèi)存中存儲的數(shù)據(jù),單位:字節(jié)
- fu.setRepositoryPath("C:\\");
- //設(shè)置一旦文件大小超過getSizeThreshold()的值時數(shù)據(jù)存放在硬盤的臨時文件夾
- 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"))
- {
- %>
【編輯推薦】
責任編輯:彭凡
來源:
CSDN