import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletInputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/** *//**
* <p>
* Title: Java 程序
* </p>
* <p>
* Description: 通用的请求处理程序,能够处理上传方式
* </p>
*
* <pre>
* 一般使用方法如下
* <%
* 指定编码方式
* request.setCharacterEncoding("GBK");
* // 为文件上传做准备,该类读取接口与 request 相同
* net.java2000.tools.Upload upload = new net.java2000.tools.Upload(request);
* // 解析
* upload.parse();
* %>
* ...
* <%
* //使用标准方法读取参数
* String name = upload.getParameter("Name");
* String[] names = upload.getParameterValues("nameMultiSelected");
* <br/>
* // 读取上传信息,比如上传照片
* <form method="POST" name="form1" enctype="multipart/form-data" action="" onsubmit="return check();">
* <input type="file" name="photo" size="8" value="更新照片">
* </form>
* // 读取表单值,也就是照片的实际信息,请注意,该方法名包含Org,和前面的不同
* // 由于上传信息经常是二进制内容,所以不能采用编码后的字符串,应采用和流完全对应的字符串
* String photo = upload.getParameterOrg("photo"); // 此方法读取原始信息,没有进行任何编码,即ISO-8859-1 格式
* // 如果转化为字节数组为
* byte[] bytes = photo.getBytes("iso-8859-1");
* // 读取照片的类型
* String contentType = upload.getContentType("photo");
* // 读取照片文件名,不包含路径
* String filename = upload.getFilename("photo");
* %>
* 请在尽可能前的地方使用,特别是<b>不要</b>再使用了
* request.getParameter("XXX");
* 后面使用,因为这时候的输入流已经被系统使用了。
* </pre>
*
* <p>
* Copyright: Copyright (c) 2002
* </p>
* <p>
* Company:
* </p>
*
* @author
* @version 1.0
*/
public class Upload implements HttpServletRequest ...{
private HttpServletRequest request = null;
public Upload(HttpServletRequest request) ...{
this.request = request;
}
public Object getAttribute(String name) ...{
return request.getAttribute(name);
}
public java.util.Enumeration getAttributeNames() ...{
return request.getAttributeNames();
}
public java.lang.String getCharacterEncoding() ...{
return request.getCharacterEncoding();
}
public void setCharacterEncoding(String env) throws java.io.UnsupportedEncodingException ...{
request.setCharacterEncoding(env);
}
public int getContentLength() ...{
return request.getContentLength();
}
public int getLocalPort() ...{
return request.getLocalPort();
}
public String getLocalAddr() ...{
return request.getLocalAddr();
}
public String getLocalName() ...{
return request.getLocalName();
}
public int getRemotePort() ...{
return request.getRemotePort();
}
public java.lang.String getContentType() ...{
return request.getContentType();
}
public ServletInputStream getInputStream() throws java.io.IOException ...{
return request.getInputStream();
}
public java.util.Map getParameterMap() ...{
return request.getParameterMap();
}
public java.lang.String getProtocol() ...{
return request.getProtocol();
}
public java.lang.String getScheme() ...{
return request.getScheme();
}
public java.lang.String getServerName() ...{
return request.getServerName();
}
public int getServerPort() ...{
return request.getServerPort();
}
public java.io.BufferedReader getReader() throws java.io.IOException ...{
return request.getReader();
}
public java.lang.String getRemoteAddr() ...{
return request.getRemoteAddr();
}
public java.lang.String getRemoteHost() ...{
return request.getRemoteHost();
}
public void setAttribute(java.lang.String name, Object o) ...{
request.setAttribute(name, o);
}
public void removeAttribute(java.lang.String name) ...{
request.removeAttribute(name);
}
public java.util.Locale getLocale() ...{
return request.getLocale();
}
public java.util.Enumeration getLocales() ...{
return request.getLocales();
}
public boolean isSecure() ...{
return request.isSecure();
}
public RequestDispatcher getRequestDispatcher(String path) ...{
return request.getRequestDispatcher(path);
}
public java.lang.String getRealPath(String path) ...{
return request.getRealPath(path);
}
public java.lang.String getAuthType() ...{
return request.getAuthType();
}
public Cookie[] getCookies() ...{
return request.getCookies();
}
public long getDateHeader(java.lang.String name) ...{
return request.getDateHeader(name);
}
public java.lang.String getHeader(java.lang.String name) ...{
return request.getHeader(name);
}
public java.util.Enumeration getHeaders(java.lang.String name) ...{
return request.getHeaders(name);
}
public java.util.Enumeration getHeaderNames() ...{
return request.getHeaderNames();
}
public int getIntHeader(java.lang.String name) ...{
return request.getIntHeader(name);
}
public java.lang.String getPathInfo() ...{
return request.getPathInfo();
}
public java.lang.String getPathTranslated() ...{
return request.getPathTranslated();
}
public java.lang.String getContextPath() ...{
return request.getContextPath();
}
public java.lang.String getQueryString() ...{
return request.getQueryString();
}
public java.lang.String getRemoteUser() ...{
return request.getRemoteUser();
}
public boolean isUserInRole(java.lang.String role) ...{
return request.isUserInRole(role);
}
public java.security.Principal getUserPrincipal() ...{
return request.getUserPrincipal();
}
public java.lang.String getRequestedSessionId() ...{
return request.getRequestedSessionId();
}
public java.lang.String getRequestURI() ...{
return request.getRequestURI();
}
public java.lang.StringBuffer getRequestURL() ...{
return request.getRequestURL();
}
public java.lang.String getServletPath() ...{
return request.getServletPath();
}
public HttpSession getSession() ...{
return request.getSession();
}
public HttpSession getSession(boolean create) ...{
return request.getSession(create);
}
public boolean isRequestedSessionIdValid() ...{
return request.isRequestedSessionIdValid();
}
public boolean isRequestedSessionIdFromCookie() ...{
return request.isRequestedSessionIdFromCookie();
}
public boolean isRequestedSessionIdFromURL() ...{
return request.isRequestedSessionIdFromURL();
}
public boolean isRequestedSessionIdFromUrl() ...{
return request.isRequestedSessionIdFromUrl();
}
// 保存名字/对象对应关系
private Hashtable uploadHash = new Hashtable();;
// 保存所有名字
private Vector names = new Vector();;
// 分割标志
private String splitsign = null;
// 结束标志
private String endsign = null;
// 数据总长度
private int totlelength = 0;
// 最大总容量,-1为不限制
private int MAX = 1024 * 1024 * 100;
// 单个最大容量,-1为不限制
private int MAX_SIMPLE = 1024 * 1024 * 50;
private boolean debug = false;
public void setDebug(boolean debug) ...{
this.debug = debug;
}
public boolean isDebug() ...{
return this.debug;
}
// 保存所有数据
// byte[] data;
/** *//**
* 设置总量的最大值
*
* @param capacity 最大值,字节形式
*/
public void setMaxCapacity(int capacity) ...{
this.MAX = capacity;
if (MAX < MAX_SIMPLE) ...{
MAX_SIMPLE = MAX;
}
}
/** *//**
* 取的总量的最大值
*
* @return 最大值的字节形式
*/
public int getMaxCapacity() ...{
return this.MAX;
}
/** *//**
* 设置单个的最大值
*
* @param capacity 单个最大值
*/
public void setMaxCapacitySimple(int capacity) ...{
this.MAX_SIMPLE = capacity;
if (MAX < MAX_SIMPLE) ...{
MAX = MAX_SIMPLE;
}
}
/** *//**
* 读取单个最大值
*
* @return 单个最大值
*/
public int getMaxCapacitySimple() ...{
return this.MAX_SIMPLE;
}
public static final int UPLOAD_OK = 0;
public static final int UPLOAD_UNKNOW_ERROR = -1;
public boolean isPost = false;
public int parse() ...{
return parse(this.request);
}
/** *//**
* 解析输入流,生成需要的各种数值
*
* @param request 输入流
* @return 解析结果
*/
public int parse(HttpServletRequest request) ...{
this.request = request;
if (request.getMethod().equals("POST")) ...{
isPost = true;
} else ...{
isPost = false;
return -1;
}
// Content-Type: multipart/form-data;
// boundary=---------------------------7d5ea1c501bc
// Content-Type: application/x-www-form-urlencoded
// 本方法只处理 multipart/form-data
String contentType = request.getContentType();
if (contentType == null || !contentType.startsWith("multipart/form-data")) ...{
isPost = false;
return -1;
}
try ...{
// 读取输入流
ServletInputStream sis = request.getInputStream();
// 流的长度
int len = request.getContentLength();
if ((MAX != -1) && (len > MAX)) ...{
return -1;
}
// 保存一行数据
byte[] b = new byte[65536];
int a = 0;
int k = 0;
String s = "";
// 读取分割标志
a = sis.readLine(b, 0, b.length);
splitsign = new String(b, 0, a);
if (debug) ...{
System.out.println(splitsign);
}
// 结束标志
endsign = new String(splitsign.substring(0, splitsign.length() - 2) + "-- ");
boolean isend;
do ...{
_upload up = new _upload(splitsign, endsign, MAX_SIMPLE);
// 解析数据
isend = up.parse(sis, this.debug);
if ( != null) ...{
// 如果已经存在这个名字的对象,则进行重名处理
if (names.contains()) ...{
_upload upp = (_upload) uploadHash.get();
// 增加重名的对象
upp.add(up.getUpload(0));
up = null;
} else ...{
// 保存名字对应关系
uploadHash.put(, up);
// 保存名字列表
names.add();
}
}
} while (!isend);
return UPLOAD_OK;
} catch (Exception e) ...{
return UPLOAD_UNKNOW_ERROR;
}
}
public String getMethod() ...{
return isPost ? "POST" : "GET";
}
public String getParameter(String name) ...{
if (!isPost) ...{
return request.getParameter(name);
}
String str = getParameterOrg(name);
if (str == null) ...{
return str;
}
try ...{
return new String(str.getBytes("iso-8859-1"), this.getCharacterEncoding());
} catch (Exception e) ...{
return str;
}
}
public String getParameterOrg(String name) ...{
if (!isPost) ...{
return request.getParameter(name);
}
return getParameterOrg(name, 0);
}
public String getParameterOrg(String name, int index) ...{
if (name == null) ...{
return null;
}
_upload up = (_upload) uploadHash.get(name);
if (up == null) ...{
return null;
} else ...{
return up.getValue(index);
}
}
public Enumeration getParameterNames() ...{
if (!isPost) ...{
return request.getParameterNames();
}
return names.elements();
}
public String[] getParameterValues(String name) ...{
if (!isPost) ...{
return request.getParameterValues(name);
}
if (name == null) ...{
return null;
}
_upload up = (_upload) uploadHash.get(name);
if (up == null) ...{
return null;
} else ...{
return up.getValues();
}
}
public String getFilename(String name) ...{
return getFilename(name, 0);
}
public String getFilename(String name, int index) ...{
if (name == null) ...{
return null;
}
_upload up = (_upload) uploadHash.get(name);
if (up == null) ...{
return null;
} else ...{
return up.getFilename(index);
}
}
public String getFullFilename(String name) ...{
return getFullFilename(name, 0);
}
public String getFullFilename(String name, int index) ...{
if (name == null) ...{
return null;
}
_upload up = (_upload) uploadHash.get(name);
if (up == null) ...{
return null;
} else ...{
return up.getFullFilename(index);
}
}
public String getContentType(String name) ...{
return getContentType(name, 0);
}
public String getContentType(String name, int index) ...{
if (name == null) ...{
return null;
}
_upload up = (_upload) uploadHash.get(name);
if (up == null) ...{
return null;
} else ...{
return up.getContentType(index);
}
}
}
class _upload ...{
// 名称
String name = null;
// 保存名称和对象的关系
Vector __uploadVector = null;
// 分割标志
private String splitsign = null;
// 结束标志
private String endsign = null;
// 单个最大容量,-1为不限制
private int MAX_SIMPLE = -1;
_upload(String splitsign, String endsign, int max_simple) ...{
this.splitsign = new String(splitsign);
this.endsign = new String(endsign);
__uploadVector = new Vector();
MAX_SIMPLE = max_simple;
}
boolean parse(ServletInputStream sis, boolean debug) throws Exception ...{
// 类型
String Content_Type = null;
// 数值
String value = null;
// 文件名
String filename = null;
// 保存数据的长度
int filelength = 0;
// 保存一行数据
byte[] b = new byte[65536];
int a = 0;
int k = 0;
String s = "";
boolean isend = false;
// -------------------- 读取分段头信息 --------------------
while (true) ...{
// 读取一行
a = sis.readLine(b, 0, b.length);
s = new String(b, 0, a, "ISO-8859-1");
if (debug) ...{
System.out.println(s);
}
// s = new String(b,0,a);
// 判断是否为空行,如果是则跳出
if (s.equals("") || s.equals(" ") || s.equals(" "))
break;
// 查找名字
if ((k = s.indexOf("name=")) != -1) ...{
s = s.substring(k + 6);
k = s.indexOf(""");
name = s.substring(0, k);
}
// 查找文件名
if ((k = s.indexOf("filename=")) != -1) ...{
s = s.substring(k + 10);
k = s.indexOf(""");
if (k == -1) ...{
filename = s.substring(0);
} else ...{
filename = s.substring(0, k);
}
}
// 查找类型
if ((k = s.indexOf("Content-Type: ")) != -1) ...{
Content_Type = s.substring(k + 14);
}
}
// -------------------- 开始读取内数据 --------------------
StringBuffer buff = new StringBuffer();
boolean overflow = false;
while (true) ...{
// 读取一行
a = sis.readLine(b, 0, b.length);
if (a == -1)
break;
s = new String(b, 0, a, "ISO-8859-1");
if (debug) ...{
System.out.println(s);
}
// s = new String(b,0,a);
// 是否到分割符/结束符
if (s.equals(splitsign)) ...{
break;
} else if (s.equals(endsign)) ...{
isend = true;
break;
}
// 限制单个数据的最大值
buff.append(s);
if ((MAX_SIMPLE != -1) && (buff.length() > MAX_SIMPLE)) ...{
buff.delete(MAX_SIMPLE, buff.length());
overflow = true;
break;
}
}
// 去掉最后的换行回车
if (!overflow && buff.length() >= 2) ...{
buff.setLength(buff.length() - 2);
}
value = buff.toString();
// 保存文件数据长度
filelength = value.length();
// 保存解析的对象
__upload __up = new __upload(name, Content_Type, value, filename);
__uploadVector.add(__up);
return isend;
}
/** *//**
* 增加一个重名的对象
*
* @param _up 对象名
*/
void add(__upload _up) ...{
__uploadVector.add(_up);
}
/** *//**
* 得到对象
*
* @param index 索引
* @return 对象
*/
__upload getUpload(int index) ...{
if ((index >= 0) && (__uploadVector.size() > index)) ...{
return (__upload) __uploadVector.elementAt(index);
} else ...{
return null;
}
}
/** *//**
* 读取值
*
* @param index 索引
* @return 第一个的值
*/
String getValue(int index) ...{
__upload _up = getUpload(index);
if (_up == null) ...{
return null;
} else ...{
return _up.value;
}
}
/** *//**
* 读取文件名
*
* @param index 索引
* @return 文件名
*/
String getFilename(int index) ...{
__upload _up = getUpload(index);
if (_up == null) ...{
return null;
} else ...{
return _up.filename;
}
}
/** *//**
* 读取文件长度
*
* @param index 索引
* @return 文件长度
*/
int getFileLength(int index) ...{
__upload _up = getUpload(index);
if (_up == null) ...{
return -1;
} else if (_up.value == null) ...{
return -1;
} else ...{
return _up.value.length();
}
}
/** *//**
* 读取文件全名
*
* @param index 索引
* @return 文件全名
*/
String getFullFilename(int index) ...{
__upload _up = getUpload(index);
if (_up == null) ...{
return null;
} else ...{
return _up.fullfilename;
}
}
/** *//**
* 读取第一个类型
*
* @param index 索引
* @return 第一个的类型
*/
String getContentType(int index) ...{
__upload _up = getUpload(index);
if (_up == null) ...{
return null;
} else ...{
return _up.Content_Type;
}
}
/** *//**
* 读取所有的值
*
* @return 值数组
*/
String[] getValues() ...{
Vector v = new Vector();
for (int i = 0; i < __uploadVector.size(); i++) ...{
v.add(((__upload) __uploadVector.elementAt(i)).value);
}
return (String[]) v.toArray(new String[0]);
}
}
class __upload ...{
// 名称
String name = null;
// 类型
String Content_Type = null;
// 数值
String value = null;
// 文件名
String filename = null;
// 文件全名
String fullfilename = null;
__upload(String name, String Content_Type, String value, String fullfilename) ...{
this.name = new String(name);
if (Content_Type != null)
this.Content_Type = new String(Content_Type.trim());
if (fullfilename != null) ...{
this.fullfilename = new String(fullfilename.trim());
int index = fullfilename.lastIndexOf("\");
this.filename = fullfilename.substring(index + 1).trim();
}
if (value != null)
this.value = value;
}
}
request.setCharacterEncoding("UTF-8");
// 为文件上传做准备,该类读取接口与 request 相同
net.java2000.tools.Upload upload = new net.java2000.tools.Upload(request);
upload.setCharacterEncoding("UTF-8");
upload.setMaxCapacity(10 * 1024 * 1024);
upload.setMaxCapacitySimple(10 * 1024 * 1024);
// 解析
upload.parse();
// 读取普通参数
String name = upload.getParameter("name"); // 普通读取参数,单选
String[] deleteaids = upload.getParameterValues("deleteaid[]"); // 读取多选普通参数
// 读取附件的方法
String pName= "myp_w_upload_1";
String filename = upload.getFilename(pName); // 读取文件名
String fullFilename = upload.getFullFilename(pName); // 读取文件全名,包括路径
String contentType = upload.getContentType(pName);
byte[] content = upload.getParameterOrg(pName).getBytes("iso-8859-1"); // 特殊的方法,对于二进制的内容,需要调用这个方法
// 如果有重名的,则需要在调用方法后面加上顺序号,比如
String filename2 = upload.getFilename(pName, 2); // 读取第二个附件的文件名
String contentType2 = upload.getContentType(pName,2);
byte[] content2 = upload.getParameterOrg(pName,2).getBytes("iso-8859-1");
















