mengdejun 发表于 2013-1-29 07:31:33

jsp 上传下载源代码

package org.whvcse.upload.impl;import java.io.Serializable;import javax.servlet.http.HttpServletRequest;/*** 文 件 名 : jsp文件上传下载<br>* * @author 孟德军 CopyRright (c) 2009: <a href='mak0000@msn.com'>mak0000</a> <br>*         文件编号: 20090526<br>* @version 1.0 <br>* 日 期: 2009.05.26 <br>* */public interface Upload extends Serializable {/*** 上传* @param request HttpServletRequest* @return 状态信息.* @throws Exception 运行异常*/public boolean upLoad(HttpServletRequest request) throws Exception;/*** 释放系统资源.* @return 析构情况* @throws Exception 运行异常.*/public boolean destory() throws Exception;public String toString();/*** 获得最后一次错误信息* @return 最后一次错误信息.*/public String getLastError();/*** 上传,调用前必须先设置HttpServletRequest* @return 状态信息.* @throws Exception 运行异常*/public boolean upload() throws Exception;/*** 启用上传日志 使用玩需调用destory()释放资源* @param s 日志信息* @return * @throws Exception*/public String server(String s) throws Exception;}package org.whvcse.upload;import java.io.BufferedOutputStream;import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.util.Calendar;import java.util.Date;import java.util.List;import java.util.Vector;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import org.whvcse.upload.extend.Toolkit;import org.whvcse.upload.impl.Upload;/*** 文 件 名 : jsp文件上传下载<br>* * @author 孟德军 CopyRright (c) 2009: <a href='mak0000@msn.com'>mak0000</a> <br>*         文件编号: 20090526<br>* @version 1.0 <br>*          日 期: 2009.05.26 <br>* */public class JspUpload implements Upload {private static final long serialVersionUID = 1L;private HttpServletRequest request = null;private BufferedWriter writer = null;/*** @see #fileSize 允许上传的文件大小*/private long fileSize = 1024;/*** @see #fileName 文件名字*/private String fileName = null;/*** @see #bufferSize 设置缓冲区的大小*/private int bufferSize = 128;/*** @see #savePath 文件保存的路径*/private String savePath = null;private int t = -1;/*** @see #check 文件约束*/private String[] check = null;/*** @see #encoding 文件编码*/private String encoding = "utf-8";/*** @see #showErrorMessage 是否显示错误信息*/private boolean showErrorMessage = true;private byte[] buffer = null;private String seperator = null;private boolean userDefineName = false;private String extendname;private Vector ErrorMessage = null;private long length = 0;private boolean isShowLog = false;public JspUpload() {}public JspUpload(String savepath) {   this.savePath = savepath;}public JspUpload(HttpServletRequest request) {   this.request = request;}public JspUpload(HttpServletRequest request, String path) {   this.request = request;   this.savePath = path;}public boolean isShowLog() {   return isShowLog;}public void setShowLog(boolean isShowLog) {   this.isShowLog = isShowLog;   try {    if (this.isShowLog)   {   writer = new BufferedWriter(new OutputStreamWriter(       new FileOutputStream(".//upload.log", true), System         .getProperty("file.encoding")));    }   } catch (FileNotFoundException e) {    e.printStackTrace();   } catch (UnsupportedEncodingException e) {    e.printStackTrace();   }}/*** @deprecated*/public boolean destory() throws Exception {   if (writer != null)   {    writer.close();   }   return true;}public boolean upLoad(HttpServletRequest request) throws Exception {   boolean status = true;   if (savePath == null) {    errorMessage("未设置保存上传文件的路径!");   }   /*   * if (this.fileName == null) { this.fileName = setFileName(); }   */   setRequest(request);   status = execute();   return status;}private void errorMessage(String message) throws Exception {   if (isShowLog) {    server("Exception" + message);   }   if (showErrorMessage) {    ErrorMessage = new Vector();    ErrorMessage.add(message);    throw new Exception(message);   }}public boolean upload() throws Exception {   boolean status = true;   /*   * if (this.fileName == null) { this.fileName = setFileName(); }   */   if (this.request == null) {    errorMessage(this.request.toString() + "不能为空!");    return false;   } else {    status = execute();   }   return status;}public String getFileName() {   return fileName;}/*** 设置上传的文件名,若不设置此项,程序将自动分析文件获得文件名,建议设置<br>* eg: test.txt* * @param fileName*            文件名*/public void setFileName(String fileName) {   this.fileName = fileName;   userDefineName = true;}public long getFileSize() {   return fileSize;}/*** 设置文件允许上传文件大小,默认为1024* * @param fileSize*            文件大小*/public void setFileSize(long fileSize) {   this.fileSize = fileSize * 1024;}public HttpServletRequest getRequest() {   return request;}/*** * @param request*            HttpServletRequest*/public void setRequest(HttpServletRequest request) {   this.request = request;}public String getSavePath() {   return savePath;}/*** 文件存储路径,必须设置此项.* * @param savePath*            文件存储路径,必须设置此项.*/public void setSavePath(String savePath) {   this.savePath = savePath;}/*** * @return 返回约束数组.*/public String[] getCheck() {   return check;}/*** 为上传文件添加约束,即不允许上传的文件类型<br>* eg:exe bmp* * @param s*            存放约束的字符串数组.若连续两次设置此项,将覆盖前一次设置.默认无.* @return 已有的约束的数目.*/public int addCheck(String[] s) {   if (check == null) {    check = s;   }   return check.length;}private boolean execute() throws Exception {   FileOutputStream out = null;   boolean status = true;   try {    buffer = new byte;    request.setCharacterEncoding(getEncoding());    // 获取流对象.    ServletInputStream in = request.getInputStream();    // 获取一行标志.    t = in.readLine(buffer, 0, buffer.length);    if (t != -1) {   seperator = new String(buffer, 0, t);   seperator = seperator.substring(0, 28);   t = -1;    }    // 扩展名.filename="f:\exercise\c++.cpp"    do {   t = in.readLine(buffer, 0, buffer.length);   String s = new String(buffer, 0, t);   int index = s.indexOf("filename=\"");   if (index != -1) {      s = s.substring(index + 10);      // s=f:\exercise\c++.cpp"      index = s.indexOf("\"");      s = s.substring(0, index);      String temp = s;      if (!userDefineName) {       this.fileName = Toolkit.parse(temp, true);       // setFileName(Toolkit.parse(temp, false));      }      // s=f:\exercise\c++.cpp      index = s.lastIndexOf(".");      extendname = s.substring(index);      if (check != null) {       for (int i = 0; i < check.length; i++) {      if (extendname.equals("." + check)) {         errorMessage("上传的文件不符合规范,请重新上传!");         break;      }       }      }      /*      * if (!userDefineName) { this.fileName = this.fileName +      * s.substring(index); // s=.cpp }      */      t = -1;   }    } while (t != -1);    int point = this.fileName.lastIndexOf(".");    if (point != -1) {   // 读取文件内容.   out = new FileOutputStream(this.savePath + "\\" + this.fileName);    } else {   out = new FileOutputStream(this.savePath + "\\" + this.fileName       + extendname);    }    t = in.readLine(buffer, 0, buffer.length);    String s = new String(buffer, 0, t);    int i = s.indexOf("Content-Type:");    if (i == -1) {   errorMessage("上传的不是文件");   status = false;   return status;    } else {   // 去掉一个空行.   in.readLine(buffer, 0, buffer.length);   t = -1;    }    long trancsize = 0;    t = in.readLine(buffer, 0, buffer.length);    while (t != -1) {   s = new String(buffer, 0, t);   if (s.length() > 28) {      s = s.substring(0, 28);      if (s.equals(seperator)) {       break;      }   }   if (fileSize != -1) {      if (trancsize >= (getFileSize())) {       File f = new File(this.savePath + "\\" + this.fileName         + extendname);       f.delete();       errorMessage("上传文件过大!");      }   }   out.write(buffer, 0, t);   trancsize += t;   t = in.readLine(buffer, 0, buffer.length);    }    length = trancsize;   } catch (Exception e) {    status = false;    File f = new File(this.savePath + "\\" + this.fileName + extendname);    f.delete();    errorMessage(e.getMessage());   } finally {    if (status) {   out.close();    }   }   if (isShowLog) {    server(request.getRemoteAddr() + " upload " + this.savePath + "\\"      + this.fileName);   }   return status;}public boolean isShowErrorMessage() {   return showErrorMessage;}public void setShowErrorMessage(boolean showErrorMessage) {   this.showErrorMessage = showErrorMessage;}public String getEncoding() {   return encoding;}/*** 设置文件编码,可不设置.* * @param encoding*            文件编码.*/public void setEncoding(String encoding) {   this.encoding = encoding;}/*** * @deprecated 该方法已废弃.*/private String setFileName() {   Calendar dt = Calendar.getInstance();   String str = "" + dt.get(Calendar.YEAR) + dt.get(Calendar.MONTH)   + dt.get(Calendar.DAY_OF_MONTH);   str = str + dt.get(Calendar.HOUR) + dt.get(Calendar.MINUTE)   + dt.get(Calendar.SECOND);   return str;}public int getBufferSize() {   return bufferSize;}/*** 设置程序缓冲区的大小.* * @param bufferSize*            缓冲区大小*/public void setBufferSize(int bufferSize) {   this.bufferSize = bufferSize;}public String getLastError() {   String message = null;   if (ErrorMessage == null) {    message = null;   } else {    message = (String) ErrorMessage.get(0);    ErrorMessage.remove(0);   }   return message;}public String toString() {   return JspUpload.class.getName();}/*** * @return 文件实际大小.KB*/public long length() {   return length / 1024;}public String server(String s) throws Exception {   writer.write(new Date().toString() + " "+s);   writer.newLine();   return s;}}package org.whvcse.upload.impl;import java.io.Serializable;import javax.servlet.http.HttpServletResponse;/*** 文 件 名 : jsp文件上传下载<br>* * @author 孟德军 CopyRright (c) 2009: <a href='mak0000@msn.com'>mak0000</a> <br>*         文件编号: 20090526<br>* @version 1.0 <br>* 日 期: 2009.05.26 <br>* */public interface Download extends Serializable {/*** 释放系统资源.* @return 析构情况* @throws Exception 运行异常.*/public boolean destory() throws Exception;/*** 执行下载方法.* @param response HttpServletResponse* @return 执行情况* @throws Exception 运行异常*/public boolean download(HttpServletResponse response) throws Exception;/*** 获得最后一次错误信息* @return 最后一次错误信息.*/public String getLastError();/*** * @return 程序名.*/public String toString();/*** 启用下载日志,若启用日志选项,使用玩需调用destory()释放资源* @param s 日志信息* @return* @throws Exception*/public String server(String s) throws Exception;}package org.whvcse.download;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.util.Date;import java.util.Vector;import javax.servlet.http.HttpServletResponse;import org.whvcse.upload.extend.Toolkit;import org.whvcse.upload.extend.Toolkit2;import org.whvcse.upload.impl.Download;/*** 文 件 名 : jsp文件上传下载<br>* * @author 孟德军 CopyRright (c) 2009: <a href='mak0000@msn.com'>mak0000</a> <br>*         文件编号: 20090526<br>* @version 1.0 <br>*          日 期: 2009.05.26 <br>* */public class JspDownload implements Download {private static final long serialVersionUID = 1L;/*** HttpServletResponse*/private HttpServletResponse response = null;/*** 文件路径*/private String filepath = null;private FileInputStream in = null;/*** 文件名*/private String fileName = null;/*** 文件类型*/private String contentType = null;/*** 文件大小*/private int sendSize = 128;/*** 配置文件路径.默认.//config//web.xml 设置Mime类型.*/private String configpath = ".//config//web.xml";private BufferedWriter writer = null;private boolean showErrorMessage = true;/*** 错误信息.*/private Vector ErrorMessage = null;private boolean isShowLog = false;private boolean isSetConfig = false;private boolean isShowChinese = false;public JspDownload() {}/*** * @param s*            配置文件路径,该方法能解析配置文件,根据配置文件初始化各变量.* @return 配置文件信息。*/public String load(String s) {   return s;}public String getConfigpath() {   return configpath;}public void setConfigpath(String configpath) {   isSetConfig = true;   this.configpath = configpath;}public JspDownload(String filepath, String mime) {   this.filepath = filepath;   this.contentType = mime;}public boolean isShowChinese() {   return isShowChinese;}public void setShowChinese(boolean isShowChinese) {   this.isShowChinese = isShowChinese;}public JspDownload(HttpServletResponse response) {   this.response = response;}public JspDownload(HttpServletResponse response, String filepath,    String mime) {   this.response = response;   this.filepath = filepath;   this.contentType = mime;}/*** @deprecated*/public boolean destory() throws Exception {   if (in != null) {    in.close();   }   if (writer != null) {    writer.close();   }   return true;}/*** 下载文件.*/public boolean download(HttpServletResponse response) throws Exception {   if (this.response == null) {    this.response = response;   }   if (this.filepath == null) {    ErrorMessage("未设置文件的路径");   }   /*   * if (this.contentType == null) { String ct =   * Toolkit.getContextType(this.filepath); if (ct != null) {   * setContentType(ct); } else { ErrorMessage("未设置文件Mime类型"); } }   */   String mime = null;   try {    mime = Toolkit2.getContextType(this.filepath, this.configpath);    if (mime != null) {   setContentType(mime);    } else {   ErrorMessage("未设置Content-Type");    }   } catch (RuntimeException e) {    ErrorMessage(e.getMessage());   }   if (this.response == null) {    ErrorMessage("HttpServletResponse初始化失败");   }   return execute();}/*** 下载文件.调用前必须设置HttpServletResponse*/public boolean download() throws Exception {   if (this.filepath == null) {    ErrorMessage("未设置文件保存路径");   }   String mime = null;   try {    mime = Toolkit2.getContextType(this.filepath, this.configpath);    if (mime != null) {   setContentType(mime);    } else {   ErrorMessage("未设置Content-Type");    }   } catch (RuntimeException e) {    ErrorMessage(e.getMessage());   }   if (this.response == null) {    ErrorMessage("HttpServletResponse初始化失败");   }   return execute();}private boolean execute() throws Exception {   boolean status = true;   OutputStream out = response.getOutputStream();   byte[] buffer = new byte;   File fileload = new File(this.filepath);   // 客户端使用保存文件的对话框.   if (this.fileName == null) {    this.fileName = Toolkit.parse(this.filepath, true);   }   if (isShowChinese) {    response.setHeader("Content-disposition", "attachment;filename="      + Toolkit2.toChinese(this.fileName));   } else {    response.setHeader("Content-disposition", "attachment;filename="      + this.fileName);   }   // 设置Mime类型.   response.setContentType(this.contentType);   // 通知文件的长度.   long fileLength = fileload.length();   String length = String.valueOf(fileLength);   response.setHeader("Content_Length", length);   // 读取文件.   try {    in = new FileInputStream(fileload);    int n = 0;    while ((n = in.read(buffer)) != -1) {   out.write(buffer, 0, n);    }    out.flush();   } catch (RuntimeException e) {    ErrorMessage(e.getMessage());    status = false;   } finally {    if (in != null) {   in.close();    }    if (out != null) {   out.close();    }   }   if (isShowLog) {    server(" down " + this.filepath);   }   return status;}/*** 返回最后一次发生错误的描述.<br>* * @see #getLastError() 返回最后一次错误的描述.*/public String getLastError() {   String message = null;   if (ErrorMessage == null) {    return message = null;   } else {    message = (String) ErrorMessage.get(0);    ErrorMessage.remove(0);   }   return message;}private void ErrorMessage(String message) throws Exception {   if (isShowLog) {    server("Exception" + message);   }   if (showErrorMessage) {    ErrorMessage = new Vector();    ErrorMessage.add(message);    throw new Exception(message);   }}public String getFilepath() {   return filepath;}/*** 设置文件路径.<br>* * @param filepath*            文件路径.*/public void setFilepath(String filepath) {   this.filepath = filepath;}/*** @deprecated 返回文件Mime类型.<br>* @return 文件Mime类型.*/public String getMime() {   return contentType;}/*** @deprecated 设置文件Mime类型.<br>* @param mime*            文件Mime类型.*/public void setMime(String mime) {   this.contentType = mime;}public HttpServletResponse getResponse() {   return response;}public void setResponse(HttpServletResponse response) {   this.response = response;}/*** 异常是否已经显示.* * @return 异常是否已经显示.*/public boolean isShowErrorMessage() {   return showErrorMessage;}/*** 是否显示异常信息.<br>* * @param showErrorMessage*            是否显示异常.*/public void setShowErrorMessage(boolean showErrorMessage) {   this.showErrorMessage = showErrorMessage;}@Overridepublic String toString() {   return JspDownload.class.getName();}public boolean isShowLog() {   return isShowLog;}public void setShowLog(boolean isShowLog) {   try {    this.isShowLog = isShowLog;    if (this.isShowLog) {   writer = new BufferedWriter(new OutputStreamWriter(       new FileOutputStream(".//down.log", true), System         .getProperty("file.encoding")));    }   } catch (FileNotFoundException e) {    e.printStackTrace();   } catch (UnsupportedEncodingException e) {    e.printStackTrace();   }}public int getSendSize() {   return sendSize;}public void setSendSize(int sendSize) {   this.sendSize = sendSize;}public String getFileName() {   return fileName;}public void setFileName(String fileName) {   this.fileName = fileName;}public String getContentType() {   return contentType;}public void setContentType(String contentType) {   this.contentType = contentType;}public String server(String s) throws Exception {   writer.write(new Date().toString() + s);   writer.newLine();   return s;}}package org.whvcse.upload.extend;/*** 文 件 名 : jsp文件上传下载<br>* * @author 孟德军 CopyRright (c) 2009: <a href='mak0000@msn.com'>mak0000</a> <br>*         文件编号: 20090526<br>* @version 1.0 <br>* 日 期: 2009.05.26 <br>* */public class Toolkit {/*** * @param filename*            文件路径.* @param isshowextendname*            是否解析扩展名.* @return 文件名*/public static String parse(String filename, boolean isshowextendname) {   String name = null;   int index = filename.lastIndexOf(".");   int extendindex = filename.lastIndexOf("\\");   if (index != -1 && extendindex != -1) {    if (isshowextendname) {   name = filename.substring(extendindex + 1);    } else {   name = filename.substring(extendindex + 1, index);    }   }   return name;}/*** * @param filename*            文件名* @return Mime类型*/public static String getContextType(String filename) {   String file = parse(filename, true);   String Mime = null;   if (file != null) {    if (file.lastIndexOf(".html") != -1      || file.lastIndexOf(".htm") != -1) {   Mime = "text/html";    }    if (file.lastIndexOf(".txt") != -1) {   Mime = "text/plain";    }    if (file.lastIndexOf(".gif") != -1) {   Mime = "image/gif";    }    if (file.lastIndexOf(".jpg") != -1      || file.lastIndexOf(".jpeg") != -1) {   Mime = "image/jpeg";    }    if (file.lastIndexOf(".tar") != -1) {   Mime = "application/x-tar";    }    if (file.lastIndexOf(".gz") != -1) {   Mime = "application/x-gzip";    }    if (file.lastIndexOf(".avi") != -1) {   Mime = "video/x-msvideo";    }    if (file.lastIndexOf(".mpg") != -1      || file.lastIndexOf(".mpeg") != -1) {   Mime = "video/mpeg";    }    if (file.lastIndexOf(".xml") != -1) {   Mime = "text/xml";    }    if (file.lastIndexOf(".css") != -1) {   Mime = "text/css";    }    if (file.lastIndexOf(".ttf") != -1) {   Mime = "application/octet-stream";    }    if (file.lastIndexOf(".pdf") != -1) {   Mime = "application/pdf";    }    if (file.lastIndexOf("zip") != -1) {   Mime = "application/zip";    }   }   return Mime;}/*** * @param s*            需要转换的编码.* @return base64编码后的字符串.*/public static String Encode(String s) {   String old = null;   if (s == "" || s.equals("")) {    old = "";   }   try {    old = new sun.misc.BASE64Encoder().encode(s.getBytes());    // old=new sun.misc.BASE64Decoder().decodeBuffer(arg0)   } catch (Exception e) {    e.printStackTrace();   }   return old;}/*** * @param s*            需要转换的编码.* @return 解码后的字符串.*/public static String DeEncode(String s) {   String old = null;   if (s == "" || s.equals("")) {    old = "";   }   try {    old = new String(new sun.misc.BASE64Decoder().decodeBuffer(s));   } catch (Exception e) {    e.printStackTrace();   }   return old;}}package org.whvcse.upload.extend;import java.io.UnsupportedEncodingException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;public class Toolkit2 extends Toolkit {/*** 自动从配置文件中解析文件所属的Mime类型.* * @param filename文件名* @param path*            配置文件路径* @return 解析后的Mime类型* @throws Exception*             配置文件错误.*/public static String getContextType(String filename, String path)    throws Exception {   String Mime = null;   String extension = null;   if (filename.equals(null) || path.equals(null) || filename == ""   || path == "") {    throw new Exception("加载文件错误,文件名或配置文件路径不能为空,请检查配置文件!");   }   int index = filename.lastIndexOf(".");   extension = filename.substring(index + 1);   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();   DocumentBuilder builder = factory.newDocumentBuilder();   Document document = builder.parse(path);   NodeList list = document.getElementsByTagName("mime-mapping");   Element element = null;   for (int i = 0; i < list.getLength(); i++) {    element = (Element) list.item(i);    // System.out.println(extension);    // System.out.println(extension.equals("ai"));    if (extension.equals(element.getElementsByTagName("extension")      .item(0).getFirstChild().getNodeValue())) {   Mime = element.getElementsByTagName("mime-type").item(0)       .getFirstChild().getNodeValue();   break;    }   }   return Mime;}/*** * @param source*            需要转换的字符串.* @return 中文编码.*/public static String toChinese(String source) {   String newString = null;   if (source == null) {    newString = "";   } else {    try {   newString = new String(source.getBytes("UTF-8"), "GB2312");    } catch (UnsupportedEncodingException e) {   e.printStackTrace();    }   }   return newString;}/*** * @param source*            需要转换的字符串.* @param charset1*            元编码* @param charset2*            新编码* @return*/public static String charset(String source, String charset1, String charset2) {   String newString = null;   if (source == null) {    newString = "";   } else {    try {   newString = new String(source.getBytes(charset1), charset2);    } catch (UnsupportedEncodingException e) {   e.printStackTrace();    }   }   return newString;}}   
 
 
页: [1]
查看完整版本: jsp 上传下载源代码