454 lines
12 KiB
Java
454 lines
12 KiB
Java
package com.sino.publicclass.common;
|
|
|
|
import java.io.*;
|
|
import java.util.Enumeration;
|
|
import java.util.Vector;
|
|
import javax.servlet.ServletInputStream;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.Date;
|
|
|
|
public class HttpDataParser {
|
|
private static final String READLINE_IOEXCEPTION =
|
|
"Fail to read data sent by the browser.";
|
|
private static final String CORRUPTED_INPUT_STREAM =
|
|
"Data stream is corrupted.";
|
|
private static final String FILE_OUTPUT_STREAM_IOEXCEPTION =
|
|
"Fail to create the attachment file.";
|
|
private static final String CLOSE_IOEXCEPTION =
|
|
"Fail to close the attachment file.";
|
|
private static final String WRITE_IOEXCEPTION =
|
|
"Fail to read the attachment file.";
|
|
private static final String WORKING_DIR_IS_FILE =
|
|
"The working directory is a file.";
|
|
private static final String WORKING_DIR_CREATE_ERROR =
|
|
"Cannot create the file working directory.";
|
|
private static final String FILE_SIZE_ERROR =
|
|
"ÉÏ´«ÎļþÌ«´ó.";
|
|
private static final String MULTIDATATYPE = "multipart/form-data";
|
|
private static final int BUF_SIZE = 0x64000;
|
|
private static final String NAME_STRING =
|
|
"Content-Disposition: form-data; name=\"";
|
|
private static final String FILENAME_STRING = "\"; filename=\"";
|
|
private static final String CONTENT_TYPE_STRING = "Content-Type:";
|
|
protected Vector parameterNames;
|
|
protected Vector parameterValues;
|
|
protected Vector uploadParameterNames;
|
|
protected Vector uploadSrcFileNames;
|
|
protected Vector uploadFileNames;
|
|
protected Vector uploadFileTypes;
|
|
protected Vector uploadFileSizes;
|
|
private int maxFileSize = 1024 * 1024 * 10;
|
|
public HttpDataParser() {
|
|
}
|
|
|
|
public HttpDataParser(int maxSize) {
|
|
setMaxFileSize(maxSize);
|
|
}
|
|
|
|
public void parser(HttpServletRequest httpservletrequest, String path, int maxSize)
|
|
throws Exception {
|
|
setMaxFileSize(maxSize);
|
|
parser(httpservletrequest, path);
|
|
}
|
|
|
|
public void parser(HttpServletRequest httpservletrequest, String path)
|
|
throws Exception {
|
|
parameterNames = new Vector(0);
|
|
parameterValues = new Vector(0);
|
|
uploadParameterNames = new Vector(0);
|
|
uploadSrcFileNames = new Vector(0);
|
|
uploadFileNames = new Vector(0);
|
|
uploadFileTypes = new Vector(0);
|
|
uploadFileSizes = new Vector(0);
|
|
byte abyte0[] = new byte[BUF_SIZE];
|
|
String parameterName = "";
|
|
String s12 = "";
|
|
Integer integer = null;
|
|
int len = 0; //³¤¶È
|
|
int cursor = 0; //Óαê
|
|
String contentType = httpservletrequest.getContentType();
|
|
if (contentType != null) {
|
|
contentType = contentType.trim();
|
|
}
|
|
//ENCTYPE£½£½multipart/form-data£¿
|
|
if (contentType == null || contentType.indexOf(MULTIDATATYPE) < 0) {
|
|
String parValue;
|
|
for (Enumeration enumeration = httpservletrequest.getParameterNames(); enumeration.hasMoreElements();
|
|
parameterValues.addElement(parValue)) {
|
|
parameterName = (String) enumeration.nextElement();
|
|
parameterNames.addElement(parameterName);
|
|
parValue = getParameter(httpservletrequest, parameterName);
|
|
}
|
|
return;
|
|
}
|
|
ServletInputStream servletinputstream = httpservletrequest.getInputStream();
|
|
int contentLength = httpservletrequest.getContentLength();
|
|
try {
|
|
len = servletinputstream.readLine(abyte0, 0, BUF_SIZE);
|
|
}
|
|
catch (IOException _ex) {
|
|
throw new Exception(READLINE_IOEXCEPTION);
|
|
}
|
|
cursor += len;
|
|
String s1 = new String(abyte0, 0, len);
|
|
String code = s1.substring(0, s1.length() - 2);
|
|
int i2 = 0;
|
|
while (contentLength > cursor) {
|
|
int k;
|
|
try {
|
|
k = servletinputstream.readLine(abyte0, 0, BUF_SIZE);
|
|
}
|
|
catch (IOException _ex) {
|
|
throw new Exception(READLINE_IOEXCEPTION);
|
|
}
|
|
cursor += k;
|
|
String s2 = null;
|
|
s2 = new String(abyte0, 0, k);
|
|
boolean isFile = false; //ÊÇ·ñÊÇfile
|
|
if (k > NAME_STRING.length()) {
|
|
if (s2.substring(0, NAME_STRING.length()).equals(NAME_STRING)) {
|
|
int l1 = s2.indexOf("\"", NAME_STRING.length());
|
|
parameterName = s2.substring(NAME_STRING.length(), l1);
|
|
l1 = s2.indexOf(FILENAME_STRING, l1);
|
|
if (l1 >= 0) {
|
|
isFile = true;
|
|
s12 = s2.substring(l1 + FILENAME_STRING.length(), s2.indexOf("\"",
|
|
l1 + FILENAME_STRING.length())).
|
|
trim();
|
|
} else {
|
|
isFile = false;
|
|
}
|
|
} else {
|
|
throw new Exception(CORRUPTED_INPUT_STREAM);
|
|
}
|
|
}
|
|
try {
|
|
k = servletinputstream.readLine(abyte0, 0, BUF_SIZE);
|
|
}
|
|
catch (IOException _ex) {
|
|
throw new Exception(READLINE_IOEXCEPTION);
|
|
}
|
|
cursor += k;
|
|
if (isFile) {
|
|
// is file
|
|
String s14;
|
|
String filetype;
|
|
String s20 = "";
|
|
if (s12 == null || s12.equals("")) {
|
|
filetype = "";
|
|
integer = new Integer(0);
|
|
s14 = "";
|
|
boolean flag1 = true;
|
|
do {
|
|
try {
|
|
k = servletinputstream.readLine(abyte0, 0, BUF_SIZE);
|
|
}
|
|
catch (IOException _ex) {
|
|
throw new Exception(READLINE_IOEXCEPTION);
|
|
}
|
|
cursor += k;
|
|
String s3 = new String(abyte0, 0, k);
|
|
if (s3.length() >= code.length() &&
|
|
s3.substring(0, code.length()).equals(code)) {
|
|
flag1 = false;
|
|
}
|
|
}
|
|
while (flag1);
|
|
} else {
|
|
String s4 = new String(abyte0, 0, k);
|
|
//read filetype
|
|
if (k > CONTENT_TYPE_STRING.length()) {
|
|
if (s4.substring(0,
|
|
CONTENT_TYPE_STRING.length()).equals(CONTENT_TYPE_STRING)) {
|
|
filetype = s4.substring(CONTENT_TYPE_STRING.length(), s4.length()).trim();
|
|
} else {
|
|
filetype = "";
|
|
}
|
|
} else {
|
|
filetype = "";
|
|
}
|
|
try {
|
|
k = servletinputstream.readLine(abyte0, 0, BUF_SIZE);
|
|
}
|
|
catch (IOException _ex) {
|
|
throw new Exception(READLINE_IOEXCEPTION);
|
|
}
|
|
cursor += k;
|
|
File file = new File(path);
|
|
if (file.isFile()) {
|
|
throw new Exception(WORKING_DIR_IS_FILE);
|
|
}
|
|
if (!file.exists() && !file.mkdirs()) {
|
|
throw new Exception(WORKING_DIR_CREATE_ERROR);
|
|
}
|
|
i2++;
|
|
FileOutputStream fileoutputstream = null;
|
|
try {
|
|
String s18;
|
|
for (s18 = String.valueOf(i2); s18.length() < 3; s18 = '0' + s18) {
|
|
;
|
|
}
|
|
//ת»»ÎļþÃû
|
|
s20 = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + s18;
|
|
int j2 = s12.lastIndexOf(46);
|
|
if (j2 > 0) {
|
|
String s19 = s12.substring(j2, s12.length());
|
|
s20 = s20 + s19;
|
|
}
|
|
|
|
s14 = path + File.separator + s20;
|
|
fileoutputstream = new FileOutputStream(s14);
|
|
}
|
|
catch (IOException _ex) {
|
|
throw new Exception(FILE_OUTPUT_STREAM_IOEXCEPTION);
|
|
}
|
|
int k1 = 0;
|
|
boolean flag2 = true;
|
|
boolean flag5 = false;
|
|
int k2 = 0;
|
|
int l2 = 0;
|
|
do {
|
|
int l;
|
|
try {
|
|
l = servletinputstream.readLine(abyte0, 0, BUF_SIZE);
|
|
}
|
|
catch (IOException _ex) {
|
|
throw new Exception(READLINE_IOEXCEPTION);
|
|
}
|
|
cursor += l;
|
|
k1 += l;
|
|
if (k1 > maxFileSize)throw new Exception(FILE_SIZE_ERROR);
|
|
String s5 = null;
|
|
s5 = new String(abyte0, 0, l);
|
|
if (s5.length() >= code.length() &&
|
|
s5.substring(0, code.length()).equals(code)) {
|
|
try {
|
|
fileoutputstream.close();
|
|
}
|
|
catch (IOException _ex) {
|
|
throw new Exception(CLOSE_IOEXCEPTION);
|
|
}
|
|
k1 -= l;
|
|
k1 -= 2;
|
|
integer = new Integer(k1);
|
|
flag2 = false;
|
|
}
|
|
if (flag2) {
|
|
try {
|
|
if (flag5) {
|
|
fileoutputstream.write(k2);
|
|
fileoutputstream.write(l2);
|
|
}
|
|
if (l >= 2) {
|
|
k2 = abyte0[l - 2];
|
|
l2 = abyte0[l - 1];
|
|
fileoutputstream.write(abyte0, 0, l - 2);
|
|
flag5 = true;
|
|
} else {
|
|
k2 = 0;
|
|
l2 = 0;
|
|
fileoutputstream.write(abyte0, 0, l);
|
|
flag5 = false;
|
|
}
|
|
}
|
|
catch (IOException _ex) {
|
|
throw new Exception(WRITE_IOEXCEPTION);
|
|
}
|
|
}
|
|
}
|
|
while (flag2 && contentLength > cursor);
|
|
}
|
|
String srcname = "";
|
|
int b;
|
|
b = s12.lastIndexOf(92);
|
|
if (b < 0) b = s12.lastIndexOf(47);
|
|
if (b > -1) {
|
|
srcname = s12.substring(b + 1, s12.length());
|
|
}
|
|
uploadParameterNames.addElement(parameterName);
|
|
uploadSrcFileNames.addElement(srcname);
|
|
|
|
uploadFileNames.addElement(s20);
|
|
uploadFileTypes.addElement(filetype);
|
|
uploadFileSizes.addElement(integer);
|
|
} else {
|
|
// is not file
|
|
boolean flag3 = true;
|
|
String tempvalue = "";
|
|
do {
|
|
int i1;
|
|
try {
|
|
i1 = servletinputstream.readLine(abyte0, 0, BUF_SIZE);
|
|
}
|
|
catch (IOException _ex) {
|
|
throw new Exception(READLINE_IOEXCEPTION);
|
|
}
|
|
cursor += i1;
|
|
String s6 = null;
|
|
s6 = new String(abyte0, 0, i1);
|
|
if (s6.length() >= code.length() &&
|
|
s6.substring(0, code.length()).equals(code)) {
|
|
flag3 = false;
|
|
}
|
|
if (flag3) {
|
|
tempvalue = tempvalue + s6.substring(0, s6.length());
|
|
}
|
|
}
|
|
while (flag3 && contentLength > cursor);
|
|
tempvalue = tempvalue.substring(0, tempvalue.length() - 2);
|
|
parameterNames.addElement(parameterName);
|
|
parameterValues.addElement(tempvalue);
|
|
}
|
|
}
|
|
}
|
|
|
|
private String getParameter(HttpServletRequest httpservletrequest, String s)
|
|
throws
|
|
Exception {
|
|
String as[] = null;
|
|
String s1 = null;
|
|
as = httpservletrequest.getParameterValues(s);
|
|
if (as != null) {
|
|
s1 = as[0];
|
|
}
|
|
return s1;
|
|
}
|
|
|
|
public String[] getParameterNames() {
|
|
int j = parameterNames.size();
|
|
String as[] = new String[j];
|
|
for (int i = 0; i < j; i++) {
|
|
as[i] = (String) parameterNames.elementAt(i);
|
|
|
|
}
|
|
return as;
|
|
}
|
|
|
|
public String getParameterValue(String s) {
|
|
int i = parameterNames.indexOf(s);
|
|
String s1;
|
|
if (i < 0) {
|
|
s1 = null;
|
|
} else {
|
|
s1 = (String) parameterValues.elementAt(i);
|
|
}
|
|
if (s1 == null) {
|
|
return "";
|
|
} else {
|
|
return s1;
|
|
}
|
|
}
|
|
|
|
public String getUploadFileName(String s) {
|
|
int i = uploadParameterNames.indexOf(s);
|
|
String s1;
|
|
if (i < 0) {
|
|
s1 = null;
|
|
} else {
|
|
s1 = (String) uploadFileNames.elementAt(i);
|
|
}
|
|
return s1;
|
|
}
|
|
|
|
public String[] getUploadFileName() {
|
|
|
|
int j = uploadParameterNames.size();
|
|
String as[] = new String[j];
|
|
for (int i = 0; i < j; i++) {
|
|
as[i] = (String) uploadParameterNames.elementAt(i);
|
|
}
|
|
|
|
return as;
|
|
|
|
}
|
|
|
|
public Integer getUploadFileSize(String s) {
|
|
int i = uploadParameterNames.indexOf(s);
|
|
Integer integer;
|
|
if (i < 0) {
|
|
integer = null;
|
|
} else {
|
|
integer = (Integer) uploadFileSizes.elementAt(i);
|
|
}
|
|
return integer;
|
|
}
|
|
|
|
public String getUploadFileType(String s) {
|
|
int i = uploadParameterNames.indexOf(s);
|
|
String s1;
|
|
if (i < 0) {
|
|
s1 = null;
|
|
} else {
|
|
s1 = (String) uploadFileTypes.elementAt(i);
|
|
}
|
|
return s1;
|
|
}
|
|
|
|
public String[] getUploadParameterNames() {
|
|
int j = uploadParameterNames.size();
|
|
String as[] = new String[j];
|
|
for (int i = 0; i < j; i++) {
|
|
as[i] = (String) uploadParameterNames.elementAt(i);
|
|
|
|
}
|
|
return as;
|
|
}
|
|
|
|
public String getUploadSrcFileName(String s) {
|
|
int i = uploadParameterNames.indexOf(s);
|
|
String s1;
|
|
if (i < 0) {
|
|
s1 = null;
|
|
} else {
|
|
s1 = (String) uploadSrcFileNames.elementAt(i);
|
|
}
|
|
if (s1 == null) {
|
|
return "";
|
|
} else {
|
|
return s1;
|
|
}
|
|
}
|
|
|
|
public void release() {
|
|
parameterNames.removeAllElements();
|
|
parameterValues.removeAllElements();
|
|
uploadParameterNames.removeAllElements();
|
|
uploadSrcFileNames.removeAllElements();
|
|
uploadFileNames.removeAllElements();
|
|
uploadFileTypes.removeAllElements();
|
|
uploadFileSizes.removeAllElements();
|
|
}
|
|
|
|
/**
|
|
* ½«ÎļþÃûµÄÊôÐÔ¸ÄΪСд×Öĸ¡£
|
|
* ´´½¨ÈÕÆÚ£º(2002-9-28 16:54:47)
|
|
* @return java.lang.String
|
|
* @param filename java.lang.String
|
|
*/
|
|
public static String convertSuffix(String filename) {
|
|
int strNum = 0; //×Ö·û"."ÔÚ×Ö·û´®ÖеÄλÖÃ
|
|
strNum = filename.indexOf(".");
|
|
|
|
if (strNum > -1) {
|
|
String firstname = ""; //ÎļþÃû
|
|
firstname = filename.substring(0, strNum);
|
|
String secondname = ""; //ÎļþÊôÐÔ
|
|
secondname = filename.substring(strNum + 1);
|
|
|
|
secondname = secondname.toLowerCase(); //½«ÎļþÊôÐÔת»¯ÎªÐ¡Ð´×Öĸ
|
|
filename = firstname + "." + secondname; //ÖØÐºϳÉÎļþÃû
|
|
}
|
|
return filename;
|
|
}
|
|
|
|
public int getMaxFileSize() {
|
|
return maxFileSize;
|
|
}
|
|
|
|
public void setMaxFileSize(int msize) {
|
|
this.maxFileSize = msize;
|
|
}
|
|
|
|
}
|