الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

متصفح ملفات و مجلدات

مغلق
بدأه رامي العيساوي في 14 أغسطس 2004 · 0 رد · 630 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1

هذا الكود يدرج تحت اتفاقية GPL و هو من انتاج شركة المانية...

<%@page import="java.util.*,

   java.net.*,

   java.text.*,

   java.util.zip.*,

   java.io.*" %>

<%!

//The number of colums for the edit field

private static final int EDITFIELD_COLS = 85;

//The number of rows for the edit field

private static final int EDITFIELD_ROWS = 30;

//Open a new window to view a file

private static final boolean USE_POPUP = true;

/**

 * If USE_DIR_PREVIEW = true, then for every directory a tooltip will be

 * created (hold the mouse over the link) with the first DIR_PREVIEW_NUMBER entries.

 * This can yield to performance issues. Turn it of, if the directory loads to slow.

 */

private static final boolean USE_DIR_PREVIEW = true;

private static final int DIR_PREVIEW_NUMBER = 10;

/**

 * The name of an optional CSS Stylesheet file

 */

private static final String CSS_NAME = "Browser.css";

/**

 * The compression level for zip file creation (0-9)

 * 0 = No compression

 * 1 = Standard compression (Very fast)

 * ...

 * 9 = Best compression (Very slow)

 */

private static final int COMPRESSION_LEVEL = 1;

/**

 * The FORBIDDEN_DRIVES are not displayed on the list. This can be usefull, if the

 * server runs on a windows platform, to avoid a message box, if you try to access

 * an empty removable drive (See KNOWN BUGS in Readme.txt).

 */

private static final String[] FORBIDDEN_DRIVES= {"a:\\"};

/**

 * Command of the shell interpreter and the parameter to run a programm

 */

private static final String[] COMMAND_INTERPRETER = {"cmd","/C"};     // Dos,Windows

//private static final String[] COMMAND_INTERPRETER = {"/bin/sh","-c"};  // Unix

/**

 * Max time in ms a process is allowed to run, before it will be terminated

 */

private static final long MAX_PROCESS_RUNNING_TIME = 30000; //30 seconds

//Button names

private static final String SAVE_AS_ZIP = "Download selected files as zip";

private static final String RENAME_FILE = "Rename File";

private static final String DELETE_FILES = "Delete selected files";

private static final String CREATE_DIR = "Create Dir";

private static final String CREATE_FILE = "Create File";

private static final String MOVE_FILES = "Move Files";

private static final String COPY_FILES = "Copy Files";

//Normally you should not change anything after this line

//----------------------------------------------------------------------------------

//Change this to locate the tempfile directory for upload (not longer needed)

private static String tempdir = ".";

private static String VERSION_NR = "1.0";

private static DateFormat dateFormat = DateFormat.getDateTimeInstance();

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);

 }

}

// A Class with methods used to process a ServletInputStream

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 + "\" is an illegal boundary indicator");

  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);

  boolean isFile = false;

  if (saveFiles){ // Create the required directory (including parent dirs)

   File f = new File(saveInDir);

   f.mkdirs();

  }

  line = getLine(is);

  if (line == null || !line.startsWith(boundary))

   throw new IOException("Boundary not found; 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("Bad data in second line");

   line = stLine.nextToken().toLowerCase();

   if (line.indexOf("form-data") < 0) throw new IllegalArgumentException("Bad data in second line");

   stFields = new StringTokenizer(stLine.nextToken(), "=\"");

   if (stFields.countTokens() < 2) throw new IllegalArgumentException("Bad data in second line");

   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); // Skip "Content-Type:" line

       line = getLine(is); // Skip blank line

       line = getLine(is); // Skip blank line

       line = getLine(is); // Position to boundary line

       continue;

      }

     }

    }

    else if (field.toLowerCase().indexOf("filename") >= 0){

     line = getLine(is); // Skip "Content-Type:" line

     line = getLine(is); // Skip blank line

     line = getLine(is); // Skip blank line

     line = getLine(is); // Position to boundary line

     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("Bad data in third line");

     stLine.nextToken(); // Content-Type

     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 parameter is dir, change saveInDir to dir

    if (paramName.equals("dir")) saveInDir = 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-2);

      line = new String(currentLine, 0, read3);

      break;

     }

     else{

      os.write(previousLine, 0, read);

      temp = currentLine;

      currentLine = previousLine;

      previousLine = temp;

      read = read3;

     }//end else

    }//end while

    os.flush();

    os.close();

    if (!saveFiles){

     ByteArrayOutputStream baos = (ByteArrayOutputStream)os;

     fileInfo.setFileContents(baos.toByteArray());

    }

    else fileInfo.file = new File(path);

    dataTable.put(paramName, fileInfo);

   }//end try

   catch (IOException e) {

    throw e;

   }

  }

  return dataTable;

 }

 /**

  * Compares boundary string to byte array

  */

 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) return false;

  return true;

 }

 /** Convenience method to read HTTP header lines */

 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);

  }

  return line;

 }

 public String getFileName(String dir, String fileName) throws IllegalArgumentException{

  String path = null;

  if (dir == null || fileName == null) throw new IllegalArgumentException("dir or fileName is null");

  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);

 }

} //End of class HttpMultiPartParser

/**

 * This class is a comparator to sort the filenames and dirs

 */

class FileComp implements Comparator{

 int mode;

 int sign;

 /**

  * @param mode sort by 1=Filename, 2=Size, 3=Date, 4=Type

  * The default sorting method is by Name

  * Negative mode means descending sort

  */

 FileComp(){

  this.mode = 1;

  this.sign = 1;

 }

 FileComp (int mode){

  if (mode<0){

   this.mode = -mode;

   sign = -1;

  }

  else{

   this.mode = mode;

   this.sign = 1;

  }

 }

 public int compare(Object o1, Object o2){

  File f1 = (File)o1;

  File f2 = (File)o2;

  if (f1.isDirectory()){

   if (f2.isDirectory()){

    switch(mode){

     //Filename or Type

     case 1: case 4:return sign * f1.getAbsolutePath().toUpperCase().compareTo(f2.getAbsolutePath().toUpperCase());

     //Filesize

     case 2:return sign * (new Long(f1.length()).compareTo(new Long(f2.length())));

     //Date

     case 3:return sign * (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 sign * f1.getAbsolutePath().toUpperCase().compareTo(f2.getAbsolutePath().toUpperCase());

    case 2:return sign * (new Long(f1.length()).compareTo(new Long(f2.length())));

    case 3:return sign * (new Long(f1.lastModified()).compareTo(new Long(f2.lastModified())));

    case 4: { // Sort by extension

     int tempIndexf1 = f1.getAbsolutePath().lastIndexOf('.');

     int tempIndexf2 = f2.getAbsolutePath().lastIndexOf('.');

     if ((tempIndexf1 == -1) && (tempIndexf2 == -1)){ // Neither have an extension

      return sign * f1.getAbsolutePath().toUpperCase().compareTo(f2.getAbsolutePath().toUpperCase());

     }

     // f1 has no extension

     else if(tempIndexf1 == -1) return -sign;

     // f2 has no extension

     else if(tempIndexf2 == -1) return sign;

     // Both have an extension

     else {

      String tempEndf1 = f1.getAbsolutePath().toUpperCase().substring(tempIndexf1);

      String tempEndf2 = f2.getAbsolutePath().toUpperCase().substring(tempIndexf2);

      return sign * tempEndf1.compareTo(tempEndf2);

     }

    }

    default:return 1;

   }

  }

 }

}

/**

 * Wrapperclass to wrap an OutputStream around a Writer

 */

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<b.length;i++){

   int n=b;

   //Convert byte to ubyte

   n=((n>>>4)&0xF)*16+(n&0xF);

   out.write (n);

  }

 }

 public void write(byte[] b, int off, int len) throws IOException{

  for (int i = off; i < off + len; i++){

   int n=b;

   n = ((n>>>4)&0xF)*16+(n&0xF);

   out.write(n);

  }

 }

} //End of class Writer2Stream

static Vector expandFileList(String[] files, boolean inclDirs){

 Vector v = new Vector();

 if (files == null) return v;

 for (int i=0; i < files.length; i++) v.add (new File(URLDecoder.decode(files)));

 for (int i=0; i < v.size(); i++){

  File f = (File) v.get(i);

  if (f.isDirectory()){

   File[] fs = f.listFiles();

   for (int n = 0; n < fs.length; n++) v.add(fs[n]);

   if (!inclDirs){

    v.remove(i);

    i--;

   }

  }

 }

 return v;

}

/**

 * Method to build an absolute path

 * @param dir the root dir

 * @param name the name of the new directory

 * @return if name is an absolute directory, returns name, else returns dir+name

 */

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;

}

/**

 * This Method converts a byte size in a kbytes or Mbytes size, depending on the size

 *     @param size The size in bytes

 *     @return String with size and unit

 */

static String convertFileSize (long size){

 int divisor = 1;

 String unit = "bytes";

 if (size>= 1024*1024){

  divisor = 1024*1024;

  unit = "MB";

 }

 else if (size>= 1024){

  divisor = 1024;

  unit = "KB";

 }

 if (divisor ==1) return size /divisor + " "+unit;

 String aftercomma = ""+100*(size % divisor)/divisor;

 if (aftercomma.length() == 1) aftercomma="0"+aftercomma;

 return size /divisor + "."+aftercomma+" "+unit;

}

/**

* Copies all data from in to out

*  @param in the input stream

* @param out the output stream

* @param buffer copy buffer

*/

static void copyStreams (InputStream in, OutputStream out, byte[] buffer) throws IOException{

 copyStreamsWithoutClose(in, out, buffer);

 in.close();

 out.close();

}

/**

* Copies all data from in to out

*  @param in the input stream

* @param out the output stream

* @param buffer copy buffer

*/

static void copyStreamsWithoutClose (InputStream in, OutputStream out, byte[] buffer) throws IOException{

 int b;

 while((b=in.read(buffer))!=-1) out.write(buffer, 0, b);

}

/**

 * Returns the Mime Type of the file, depending on the extension of the filename

 */

static String getMimeType(String fName){

 fName = fName.toLowerCase();

 if (fName.endsWith(".jpg")||fName.endsWith(".jpeg")||fName.endsWith(".jpe")) return "image/jpeg";

 else if (fName.endsWith(".gif")) return "image/gif";

 else if (fName.endsWith(".pdf")) return "application/pdf";

 else if (fName.endsWith(".htm")||fName.endsWith(".html")||fName.endsWith(".shtml")) return "text/html";

 else if (fName.endsWith(".avi")) return "video/x-msvideo";

 else if (fName.endsWith(".mov")||fName.endsWith(".qt")) return "video/quicktime";

 else if (fName.endsWith(".mpg")||fName.endsWith(".mpeg")||fName.endsWith(".mpe")) return "video/mpeg";

 else if (fName.endsWith(".zip")) return "application/zip";

 else if (fName.endsWith(".tiff")||fName.endsWith(".tif")) return "image/tiff";

 else if (fName.endsWith(".rtf")) return "application/rtf";

 else if (fName.endsWith(".mid")||fName.endsWith(".midi")) return "audio/x-midi";

 else if (fName.endsWith(".xl")||fName.endsWith(".xls")||fName.endsWith(".xlv")||fName.endsWith(".xla")

   ||fName.endsWith(".xlb")||fName.endsWith(".xlt")||fName.endsWith(".xlm")||fName.endsWith(".xlk"))

  return "application/excel";

 else if (fName.endsWith(".doc")||fName.endsWith(".dot")) return "application/msword";

 else if (fName.endsWith(".png")) return "image/png";

 else if (fName.endsWith(".xml")) return "text/xml";

 else if (fName.endsWith(".svg")) return "image/svg+xml";

 else if (fName.endsWith(".mp3")) return "audio/mp3";

 else if (fName.endsWith(".ogg")) return "audio/ogg";

 else return "text/plain";

}

/**

* Converts some important chars (int) to the corresponding html string

*/

static String conv2Html(int i){

 if (i=='&') return "&";

 else if (i=='<') return "<";

 else if (i=='>') return ">";

 else if (i=='"') return """;

 else return ""+(char)i;

}

/**

* Converts a normal string to a html conform string

*/

static String conv2Html(String st){

 StringBuffer buf = new StringBuffer();

 for (int i = 0;i<st.length();i++){

  buf.append(conv2Html(st.charAt(i)));

 }

 return buf.toString();

}

/**

* Starts a native process on the server

*  @param command the command to start the process

* @param dir the dir in which the process starts

*/

static String startProcess (String command, String dir) throws IOException{

 StringBuffer ret = new StringBuffer();

 String[] comm = new String[3];

 comm[0] = COMMAND_INTERPRETER[0];

 comm[1] = COMMAND_INTERPRETER[1];

 comm[2] = command;

 long start = System.currentTimeMillis();

 try {

  //Start process

  Process ls_proc = Runtime.getRuntime().exec(comm, null, new File(dir));

  //Get input and error streams

  BufferedInputStream ls_in = new BufferedInputStream(ls_proc.getInputStream());

  BufferedInputStream ls_err = new BufferedInputStream(ls_proc.getErrorStream());

  boolean end = false;

  while (!end){

   int c=0;

   while ((ls_err.available()>0)&&(++c <= 1000)){

    ret.append (conv2Html(ls_err.read()));

   }

   c=0;

   while ((ls_in.available()>0)&&(++c <= 1000)){

    ret.append (conv2Html(ls_in.read()));

   }

   try{

    ls_proc.exitValue();

    //if the process has not finished, an exception is thrown

    //else

    while (ls_err.available()>0) ret.append(conv2Html(ls_err.read()));

    while (ls_in.available()>0) ret.append(conv2Html(ls_in.read()));

    end = true;

   }

   catch (IllegalThreadStateException ex){

    //Process is running

   }

   //The process is not allowed to run longer than given time.

   if (System.currentTimeMillis() - start > MAX_PROCESS_RUNNING_TIME){

    ls_proc.destroy();

    end = true;

    ret.append ("!!!! Process has timed out, destroyed !!!!!");

   }

   try { Thread.sleep(50); } catch (InterruptedException ie) {}

  }

 }

 catch (IOException e) {

  ret.append ("Error: "+e);

 }

 return ret.toString();

}

/**

* Converts a dir string to a linked dir string

*  @param dir the directory string (e.g. /usr/local/httpd)

* @param browserLink web-path to Browser.jsp

*/

static String dir2linkdir(String dir, String browserLink, int sortMode){

 File f = new File(dir);

 StringBuffer buf = new StringBuffer();

 while (f.getParentFile()!=null){

  if (f.canRead()){

   String encPath = URLEncoder.encode(f.getAbsolutePath());

   buf.insert(0, "<a href=\""+browserLink+"?sort="+sortMode+"&dir="+encPath+"\">"

    +conv2Html(f.getName())+File.separator+"</a>");

  }

  else buf.insert(0, conv2Html(f.getName())+File.separator);

  f = f.getParentFile();

 }

 if (f.canRead()){

  String encPath = URLEncoder.encode(f.getAbsolutePath());

  buf.insert(0, "<a href=\""+browserLink+"?sort="+sortMode+"&dir="+encPath+"\">"

  +conv2Html(f.getAbsolutePath())+"</a>");

 }

 else buf.insert(0, f.getAbsolutePath());

 return buf.toString();

}

/**

* Returns true if the given filename tends towards a packed file

*/

static boolean isPacked(String name, boolean gz){

 return (name.toLowerCase().endsWith(".zip")||name.toLowerCase().endsWith(".jar")||

   (gz&&name.toLowerCase().endsWith(".gz"))||name.toLowerCase().endsWith(".war"));

}

//---------------------------------------------------------------------------------------------------------------

%>

<%

//Get the current browsing directory

request.setAttribute("dir", request.getParameter("dir"));

// The browser_name variable is used to keep track of the URI

// of the jsp file itself.  It is used in all link-backs.

final String browser_name = request.getRequestURI();

final String FOL_IMG = "";

boolean nohtml = false;

boolean dir_view = true;

// View file

if (request.getParameter("file")!=null){

 File f = new File (request.getParameter("file"));

 if (f.exists() && f.canRead()) {

  if (isPacked(f.getName(), false)){

   //If zipFile, do nothing here

  }

  else{

   String mimeType = getMimeType(f.getName());

   response.setContentType(mimeType);

   if (mimeType.equals("text/plain"))

    response.setHeader("Content-Disposition", "inline;filename=\"temp.txt\"");

   else

    response.setHeader ("Content-Disposition", "inline;filename=\""+f.getName()+"\"");  

   BufferedInputStream fileInput = new BufferedInputStream(new FileInputStream(f));

   byte buffer[] = new byte[8 * 1024];

   out.clearBuffer();

   OutputStream out_s = new Writer2Stream(out);

   copyStreamsWithoutClose(fileInput, out_s, buffer);

   fileInput.close();

   out_s.flush();

   nohtml = true;

   dir_view = false;

  }

 }

 else {

  request.setAttribute("dir", f.getParent());

  request.setAttribute("error", "File "+f.getAbsolutePath()+

    " does not exist or is not readable on the server");

 }

}

// Download selected files as zip file

else if ((request.getParameter("Submit")!=null)&&(request.getParameter("Submit").equals(SAVE_AS_ZIP))){

 Vector v = expandFileList(request.getParameterValues("selfile"), false);

 if (v.size() == 0){

  request.setAttribute("error", "No files selected");  

 }

 else{

  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=\"rename_me.zip\"");

  out.clearBuffer();

  ZipOutputStream zipout = new ZipOutputStream(new Writer2Stream(out));

  zipout.setComment("Created by jsp File Browser v. " + VERSION_NR);

  zipout.setLevel(COMPRESSION_LEVEL);

  for (int i=0;i<v.size();i++){

   File f = (File)v.get(i);

   if (f.canRead()){

    zipout.putNextEntry(new ZipEntry(f.getAbsolutePath().substring(dir_l+1)));

    BufferedInputStream fr = new BufferedInputStream(new FileInputStream(f));

    byte buffer[] = new byte[0xffff];

    copyStreamsWithoutClose(fr, zipout, buffer);

/*     int b;

    while ((b=fr.read())!=-1) zipout.write(b);*/

    fr.close();

    zipout.closeEntry();

   }

  }

  zipout.finish();

  out.flush();

  nohtml = true;

  dir_view = false;

 }

}

// Download file

else if (request.getParameter("downfile") != null){

 String filePath = request.getParameter("downfile");

 File f = new File(filePath);

 if (f.exists() && f.canRead()) {

  response.setContentType ("application/octet-stream");

  response.setHeader ("Content-Disposition", "attachment;filename=\""+f.getName()+"\"");

  response.setContentLength((int) f.length());  

  BufferedInputStream fileInput = new BufferedInputStream(new FileInputStream(f));

  byte buffer[] = new byte[8 * 1024];

  out.clearBuffer();

  OutputStream out_s = new Writer2Stream(out);

  copyStreamsWithoutClose(fileInput, out_s, buffer);

  fileInput.close();

  out_s.flush();

  nohtml = true;

  dir_view = false;

 }

 else {

  request.setAttribute("dir", f.getParent());

  request.setAttribute("error", "File "+f.getAbsolutePath()+

    " does not exist or is not readable on the server");

 }

}

if (!nohtml) {

 // If no parameter is submitted, it will take the path from jsp file browser

 if (request.getAttribute("dir") == null){

  String path = null;

  if (application.getRealPath(request.getRequestURI()) != null)

   path = new File(application.getRealPath(request.getRequestURI())).getParent();

  if (path == null){ // handle the case were we are not in a directory (ex: war file)

   path = new File(".").getAbsolutePath();

  }

  request.setAttribute("dir", path);

 }%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">

<meta name="robots" content="noindex">

<meta http-equiv="expires" content="0">

<meta http-equiv="pragma" content="no-cache">

<%

 //If a cssfile exists, it will take it

 String cssPath = null;

 if (application.getRealPath(request.getRequestURI()) != null)

  cssPath = new File(application.getRealPath(request.getRequestURI())).getParent()

   +File.separator+CSS_NAME;

 if (cssPath == null)

  cssPath = application.getResource(CSS_NAME).toString();

 if (new File (cssPath).exists()){

%>

<link rel="stylesheet" type="text/css" href="<%=CSS_NAME%>">

     <%}

 else{%>

<style type="text/css">

 .button {background-color: #c0c0c0; color: #666666;

 border: 1px solid #999999; }

 .button:Hover { color: #444444 }

 table.filelist {background-color:#666666; width:100%; border:0px none #ffffff}

 th { background-color:#c0c0c0 }

 tr.mouseout { background-color:#ffffff; }

 tr.mousein  { background-color:#eeeeee; }

 tr.checked  { background-color:#cccccc }

 tr.mousechecked { background-color:#c0c0c0 }

 td { font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 8pt; color: #666666;}

 td.message { background-color: #FFFF00; color: #000000; text-align:center; font-weight:bold}

 td.error { background-color: #FF0000; color: #000000; text-align:center; font-weight:bold}

 A { text-decoration: none; }

 A:Hover { color : Red; text-decoration : underline; }

 BODY { font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 8pt; color: #666666;}

</style>

<%}

}

//Comandwindow

if (request.getParameter("command")!=null){

 if (!"Cancel".equalsIgnoreCase(request.getParameter("Submit"))){

%>

<title>Launch commands in <%=request.getAttribute("dir") %></title>

</head>

<body>

<%

  out.println("<form action=\"" + browser_name + "\" method=\"Post\">\n" +

    "<textarea name=\"text\" wrap=\"off\" cols=\"" +

    EDITFIELD_COLS+"\" rows=\"" + EDITFIELD_ROWS + "\" readonly>");

  String ret = "";

  if (!request.getParameter("command").equalsIgnoreCase(""))

   ret = startProcess(request.getParameter("command"), (String)request.getAttribute("dir"));

  out.println(ret);

%></textarea>

<input type="hidden" name="dir" value="<%= request.getAttribute("dir")%>">

<br>

<table>

<tr><td title="Enter your command">

<input size="<%=EDITFIELD_COLS%>" type="text" name="command" value="">

</td></tr>

<tr><td><input type="Submit" name="Submit" value="Launch">

<input type="hidden" name="sort" value="<%=request.getParameter("sort")%>">

<input type="Submit" name="Submit" value="Cancel"></td></tr>

</table>

</form>

</body>

</html>

<%

  dir_view = false;

  request.setAttribute("dir", null);

 }

}

//Click on a filename, special viewer (zip+jar file)

else if (request.getParameter("file")!=null){

 File f = new File(request.getParameter("file"));

 if (isPacked(f.getName(), false)){

  //ZipFile

  try{

   ZipFile zf = new ZipFile(f);

   Enumeration entries = zf.entries();

%>

<title><%= f.getAbsolutePath() %></title>

</head>

<body>

<h2>Content of <%=conv2Html(f.getName())%></h2><br>

<table class="filelist" cellspacing="1px" cellpadding="0px">

<th>Name</th><th>Uncompressed size</th><th>Compressed size</th><th>Compr. ratio</th><th>Date</th>

<%

   long size=0;

   int fileCount=0;

   while (entries.hasMoreElements()){

    ZipEntry entry = (ZipEntry) entries.nextElement();

    if (!entry.isDirectory()){

     fileCount++;

     size+=entry.getSize();

     long ratio = 0;

     if (entry.getSize() != 0) ratio = (entry.getCompressedSize()*100)/entry.getSize();

     out.println("<tr class=\"mouseout\"><td>"+conv2Html(entry.getName())+"</td><td>"+

       convertFileSize(entry.getSize())+

       "</td><td>"+convertFileSize(entry.getCompressedSize())+

       "</td><td>"+ratio+"%"+

       "</td><td>"+dateFormat.format(new Date(entry.getTime()))

       +"</td></tr>");

    }

   }

   zf.close();

   //No directory view

   dir_view = false;

   request.setAttribute("dir", null);

%>

</table>

<p align=center>

<b><%=convertFileSize(size)%> in <%=fileCount%> files in <%=f.getName()%>. Compression ratio: <%=(f.length()*100)/size%>%

</b></p>

</body></html>

<%

  }

  catch (ZipException ex){

   request.setAttribute("error", "Cannot read "+f.getName()+", no valid zip file");

  }

  catch (IOException ex){

   request.setAttribute("error", "Reading of "+f.getName()+" aborted. Error: "+ex);

  }

 }

}

// Upload

else if ((request.getContentType()!=null)&&(request.getContentType().toLowerCase().startsWith("multipart"))){

 response.setContentType("text/html");

 HttpMultiPartParser parser = new HttpMultiPartParser();

 boolean error = false;

 try{

  int bstart = request.getContentType().lastIndexOf("oundary=");

  String bound = request.getContentType().substring(bstart+8);

  Hashtable ht = parser.processData(request.getInputStream(), bound, tempdir);

  if (ht.get("myFile")!=null){

   FileInfo fi = (FileInfo)ht.get("myFile");

   File f = fi.file;

   // Move file from temp to the right dir

   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("error", "Cannot upload file.");

    error = true;

    f.delete();

   }

  }

  else{

   request.setAttribute("error", "No file selected for upload");

   error = true;

  }

  request.setAttribute("dir", (String)ht.get("dir"));

 }

 catch (Exception e){

  request.setAttribute("error", "Error "+e+". Upload aborted");

  error = true;

 }

 if (!error) request.setAttribute("message", "File upload correctly finished.");

}

// The form to edit a text file

else if (request.getParameter("editfile") != null){

%>

<title>Edit <%=conv2Html(request.getParameter("editfile"))%></title>

</head>

<body>

<%

 //No File directory is shown

 request.setAttribute("dir", null);

 dir_view = false;

 File ef = new File(request.getParameter("editfile"));

 BufferedReader reader = new BufferedReader(new FileReader(ef));

 String disable = "";

 if (!ef.canWrite()) disable = " readonly";

 out.println("<form action=\"" + browser_name + "\" method=\"Post\">\n" +

   "<textarea name=\"text\" wrap=\"off\" cols=\"" +

   EDITFIELD_COLS+"\" rows=\"" + EDITFIELD_ROWS + "\"" + disable + ">");

 String c;

 // Write out the file and check if it is a win or unix file

 int i;

 boolean dos=false;

 boolean cr=false;

 while ((i=reader.read())>=0) {

  out.print(conv2Html(i));

  if (i=='\r') cr=true;

  else if (cr&&(i=='\n')) dos=true;

  else cr = false;

 }

 reader.close();

%></textarea>

<input type="hidden" name="nfile" value="<%= request.getParameter("editfile")%>">

<br>

<table>

 <tr><td><input type="radio" name="lineformat" value="dos" <%= dos?"checked":""%>>Ms-Dos/Windows</td>

 <td><input type="radio" name="lineformat" value="unix" <%= dos?"":"checked"%>>Unix</td></tr>

 <tr><td title="Enter the new filename"><input type="text" name="new_name" value="<%=ef.getName()%>"></td>

 <td><input type="Submit" name="Submit" value="Save"></td>

 <td><input type="Submit" name="Submit" value="Cancel">

 <input type="hidden" name="sort" value="<%=request.getParameter("sort")%>">

 </td></tr>

 <tr><td><input type="checkbox" name="Backup" checked>Write backup</td></tr>

</table>

</form>

</body>

</html>

<%

}

// Save or cancel the edited file

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() && new_f.canWrite() && request.getParameter("Backup")!=null){

   File bak = new File(new_f.getAbsolutePath()+".bak");

   bak.delete();

   new_f.renameTo(bak);

  }

  if (new_f.exists() && !new_f.canWrite())

   request.setAttribute("error", "Cannot write to "+new_f.getName()+", file is write protected.");

  else{

   BufferedWriter outs = new BufferedWriter(new FileWriter(new_f));

   StringReader text = new StringReader (request.getParameter("text"));

   int i;

   boolean cr=false;

   String lineend = "\n";

   if (request.getParameter("lineformat").equals("dos")) lineend = "\r\n";

   while ((i=text.read())>=0) {

    if (i=='\r') cr = true;

    else if (i=='\n') { outs.write (lineend); cr=false;}

    else if (cr) {outs.write (lineend); cr=false;}

    else {outs.write (i); cr=false;}

   }

   outs.flush();

   outs.close();

  }

 }

 request.setAttribute("dir", f.getParent());

}

//Unpack file to the current directory without overwriting

else if (request.getParameter("unpackfile") != null){

 File f = new File (request.getParameter("unpackfile"));

 String root = f.getParent();

 request.setAttribute("dir", root);

 //Check if file exists

 if (!f.exists()){

  request.setAttribute("error", "Cannot unpack "+f.getName()+", file does not exist");

 }

 //Check if directory is readonly

 else if (!f.getParentFile().canWrite()){

  request.setAttribute("error", "Cannot unpack "+f.getName()+", directory is write protected.");

 }

 //GZip

 else if (f.getName().toLowerCase().endsWith(".gz")){

  //New name is old Name without .gz

  String newName = f.getAbsolutePath().substring(0, f.getAbsolutePath().length()-3);

  try{

   byte buffer[] = new byte[0xffff];

   copyStreams(new GZIPInputStream(new FileInputStream(f)), new FileOutputStream(newName), buffer);

  }

  catch (IOException ex){

   request.setAttribute("error", "Unpacking of "+f.getName()+" aborted. Error: "+ex);

  }

 }

 //Else try Zip

 else{

  try{

   ZipFile zf = new ZipFile(f);

   Enumeration entries = zf.entries();

   //First check whether a file already exist

   boolean error=false;

   while (entries.hasMoreElements()){

    ZipEntry entry = (ZipEntry) entries.nextElement();

    if (!entry.isDirectory() && new File(root+File.separator+entry.getName()).exists()){

     request.setAttribute("error", "Cannot unpack "+f.getName()+", File "+entry.getName()+" already exists.");

     error = true;

     break;

    }

   }

   if (!error){

    //Unpack File

    entries = zf.entries();

    byte buffer[] = new byte[0xffff];

    while (entries.hasMoreElements()){

     ZipEntry entry = (ZipEntry) entries.nextElement();

     File n = new File(root+File.separator+entry.getName());

     if (entry.isDirectory()) n.mkdirs();

     else{

      n.getParentFile().mkdirs();

      n.createNewFile();

      copyStreams(zf.getInputStream(entry), new FileOutputStream (n), buffer);

     }

    }

    zf.close();

    request.setAttribute("message", "Unpack of "+f.getName()+" was successful.");

   }

  }

  catch (ZipException ex){

   request.setAttribute("error", "Cannot unpack "+f.getName()+", no valid zip file");

  }

  catch (IOException ex){

   request.setAttribute("error", "Unpacking of "+f.getName()+" aborted. Error: "+ex);

  }

 }

}

// Delete Files

else if ((request.getParameter("Submit")!=null)&&(request.getParameter("Submit").equals(DELETE_FILES))){

 Vector v = expandFileList(request.getParameterValues("selfile"), true);

 boolean error = false;

 //delete backwards

 for (int i=v.size()-1;i>=0;i--){

  File f = (File)v.get(i);

  if (!f.canWrite()||!f.delete()){

   request.setAttribute("error", "Cannot delete "+f.getAbsolutePath()+". Deletion aborted");

   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("error", "No files selected");

}

// Create Directory

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", "Directory created");

 }

 else request.setAttribute("error", "Creation of directory "+new_dir+" failed");

}

// Create a new empty file

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 (!"".equals(file_name.trim()) && !file_name.endsWith(File.separator)){

  if (new File(new_file).createNewFile()) request.setAttribute("message", "File created");

  else request.setAttribute("error", "Creation of file "+new_file+" failed");

 }

 else request.setAttribute("error", "Error: "+file_name+" is not a valid filename");

}

// Rename a file

else if ((request.getParameter("Submit") != null) && (request.getParameter("Submit").equals(RENAME_FILE))){

 Vector v = expandFileList(request.getParameterValues("selfile"), true);

 String dir = "" + request.getAttribute("dir");

 String new_file_name = request.getParameter("cr_dir");

 String new_file = getDir (dir, new_file_name);

 // The error conditions:

 // 1) Zero Files selected

 if (v.size() <= 0) request.setAttribute("error", "Select exactly one file or folder. Rename failed");

 // 2a) Multiple files selected and the first isn't a dir

 //     Here we assume that expandFileList builds v from top-bottom, starting with the dirs

 else if ((v.size() > 1) && !(((File)v.get(0)).isDirectory()))

  request.setAttribute("error", "Select exactly one file or folder. Rename failed");

 // 2b) If there are multiple files from the same directory, rename fails

 else if ((v.size() > 1) && ((File)v.get(0)).isDirectory() && !(((File)v.get(0)).getPath().equals(((File)v.get(1)).getParent()))){

  request.setAttribute("error", "Select exactly one file or folder. Rename failed");

 }

 else {

  File f = (File)v.get(0);

  // Test, if file_name is empty

  if ((new_file.trim() != "") && !new_file.endsWith(File.separator)){

   if (!f.canWrite() || !f.renameTo(new File(new_file.trim()))){

    request.setAttribute("error", "Creation of file " + new_file + " failed");

   }

   else request.setAttribute("message", "Renamed file "+((File)v.get(0)).getName()+" to "+new_file);

  }

  else request.setAttribute("error", "Error: \"" + new_file_name + "\" is not a valid filename");

 }

}

// Move selected file(s)

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;

 // This ensures that new_dir is a directory

 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("error", "Cannot move "+f.getAbsolutePath()+". Move aborted");

   error = true;

   break;

  }

 }

 if ((!error) && (v.size() > 1)) request.setAttribute("message", "All files moved");

 else if ((!error) && (v.size() > 0)) request.setAttribute("message", "File moved");

 else if (!error) request.setAttribute("error", "No files selected");

}

// Copy Files

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;

 try{

  byte buffer[] = new byte[0xffff];

  for (int i = 0; i < v.size(); i++){

   File f_old = (File)v.get(i);

   File f_new = new File(new_dir + f_old.getAbsolutePath().substring(dir.length()));

   if (f_old.isDirectory()) f_new.mkdirs();

   // Overwriting is forbidden

   else if (!f_new.exists()){

    copyStreams(new FileInputStream (f_old), new FileOutputStream (f_new), buffer);

   }

   else{

    // File exists

    request.setAttribute("error", "Cannot copy "+f_old.getAbsolutePath()+", file already exists. Copying aborted");

    error = true;

    break;

   }

  }

 }

 catch (IOException e){

  request.setAttribute("error", "Error "+e+". Copying aborted");

  error = true;

 }

 if ((!error)&&(v.size()>1)) request

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why

هذا الموضوع مغلق.

مواضيع مشابهة