由于经常用到java上传的组件, 每次都要一行一行的写不是很方便, 所以抽了点时间封装一下, 也为以后方便使用. 底层也是是用apache的upload上传组件, 不过仅仅是封装了一下, 更方便用了而已.
具体的组件是继承了 HttpServletRequest接口. 我们可以象使用jsp中的request一样使用upload组件了. 具体代码如下:
FileHttpServletRequest 接口:
/*
* Created on 2006-7-3
*
*/
package cn.bloghome.javasky.web;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
public interface FileHttpServletRequest extends HttpServletRequest {
FileItem getFileParameter(String key);
FileItem[] getFileParameterValues(String key);
}
实现类: FileRequestHandler
/*
* Created on 2006-7-3
*
*/
package cn.bloghome.javasky.web;
import java.io.File;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* @author javaSky
*
*/
public class FileRequestHandler implements Serializable, InvocationHandler {
/**
*
*/
private static final long serialVersionUID = -2633528184124692029L;
private HttpServletRequest req;
private boolean isMultipart;
private int maxMemorySize;
private String tempDirectory;
private long maxFileSize;
private Map fileMap = new HashMap();
private Map paraMap = new HashMap();
private Map readOnlyParaMap;
private FileRequestHandler(HttpServletRequest req) throws FileUploadException{
this.req = req;
}
private void parseRequest() throws FileUploadException {
if(req != null){
isMultipart = ServletFileUpload.isMultipartContent(req);
}
if(isMultipart){
//Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
if(maxMemorySize > 0){
factory.setSizeThreshold(maxMemorySize);
}
if (tempDirectory != null) {
File tmpDir = new File(tempDirectory);
if (tmpDir.exists() && tmpDir.isDirectory()
&& tmpDir.canWrite()) {
factory.setRepository(tmpDir);
}
}
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
if(maxFileSize > 0){
upload.setSizeMax(maxFileSize);
}
// Parse the request
List /* FileItem */ items = upload.parseRequest(req);
Map tmpParaMap = new HashMap();
Map tmpFileMap = new HashMap();
for(Iterator it = items.iterator(); it.hasNext();){
FileItem item = (FileItem) it.next();
//if(item.isFormField()){
List list1 = (List) tmpParaMap.get(item.getFieldName());
if(list1 == null){
list1 = new ArrayList();
tmpParaMap.put(item.getFieldName(), list1);
}
String vl = null;
if(item.isFormField()){
try {
vl = req.getCharacterEncoding() == null ? item.getString() : item.getString(req.getCharacterEncoding());
} catch (UnsupportedEncodingException e) {
//e.printStackTrace();
}
}else{
vl = item.getName();
}
list1.add(vl);
//}//else{
List list2 = (List) tmpFileMap.get(item.getFieldName());
if(list2 == null){
list2 = new ArrayList();
tmpFileMap.put(item.getFieldName(), list2);
}
list2.add(item);
//}
}
if(tmpParaMap.size() > 0){
for (Iterator it = tmpParaMap.entrySet().iterator(); it.hasNext();){
Entry en = (Entry) it.next();
List vl = (List)en.getValue();
paraMap.put(en.getKey(), vl.toArray(new String[vl.size()]));
}
}
if(tmpFileMap.size() > 0){
for(Iterator it = tmpFileMap.entrySet().iterator(); it.hasNext();){
Entry en = (Entry) it.next();
List vl = (List) en.getValue();
fileMap.put(en.getKey(), vl.toArray(new FileItem[vl.size()]));
}
}
readOnlyParaMap = Collections.unmodifiableMap(paraMap);
}
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(req == null){
return null;
}
if(isMultipart){
String mName = method.getName();
if (mName.equals("getParameter")) {
String para = (String) args[0];
return getParameter(para);
}else if(mName.equals("getParameterValues")){
String para = (String) args[0];
return (String[]) paraMap.get(para);
}else if(mName.equals("getParameterMap")){
return readOnlyParaMap;
}else if(mName.equals("getParameterNames")){
return getParameterNames();
}else if(mName.equals("getFileParameter")){
String para = (String) args[0];
return getFileParameter(para);
}else if(mName.equals("getFileParameterValues")){
String para = (String) args[0];
return fileMap.get(para);
}
}
return method.invoke(req, args);
}
/**
* overwrite HttpServletRequest.getParameterNames(String) method.
* @return
*/
public Enumeration getParameterNames(){
Enumeration names = new Enumeration(){
private Iterator it = paraMap.keySet().iterator();
public boolean hasMoreElements() {
return it.hasNext();
}
public Object nextElement() {
return it.next();
}
};
return names;
}
/**
* overwrite FileHttpServletRequest.getFileParameter(String) method.
* @param key
* @return
*/
public FileItem getFileParameter(String key){
FileItem[] fs = (FileItem[]) fileMap.get(key);
if(fs != null && fs.length > 0){
return fs[0];
}
return null;
}
/**
* overwrite HttpServletRequest.getParameter(String) method.
* @param key
* @return
*/
public String getParameter(String key){
String[] vs = (String[]) paraMap.get(key);
if(vs != null && vs.length > 0){
return vs[0];
}
return null;
}
/**
* parse request
* @param req
* @return
* @throws FileUploadException
*/
public static FileHttpServletRequest fileParse(HttpServletRequest req)
throws FileUploadException {
return fileParse(req, -1, null, -1);
}
/**
* parse request
* @param req
* @return
* @throws FileUploadException
*/
public static FileHttpServletRequest fileParse(HttpServletRequest req,
int maxMemorySize, String tempDirectory, int maxFileSize)
throws FileUploadException {
FileRequestHandler handler = new FileRequestHandler(req);
handler.maxFileSize = maxFileSize;
handler.maxMemorySize = maxMemorySize;
handler.tempDirectory = tempDirectory;
handler.parseRequest();
FileHttpServletRequest req1 = (FileHttpServletRequest) Proxy
.newProxyInstance(FileRequestHandler.class.getClassLoader(),
new Class[] { FileHttpServletRequest.class }, handler);
return req1;
}
}
如何使用: 使用的是创建模式中的工厂方法模式, 我们可以如此创建, FileHttpServletRequest req = FileRequestHandler.fileParse(request); 接下来就可以象使用request一样使用它了.
具体的组件是继承了 HttpServletRequest接口. 我们可以象使用jsp中的request一样使用upload组件了. 具体代码如下:
FileHttpServletRequest 接口:
/*
* Created on 2006-7-3
*
*/
package cn.bloghome.javasky.web;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
public interface FileHttpServletRequest extends HttpServletRequest {
FileItem getFileParameter(String key);
FileItem[] getFileParameterValues(String key);
}
实现类: FileRequestHandler
/*
* Created on 2006-7-3
*
*/
package cn.bloghome.javasky.web;
import java.io.File;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* @author javaSky
*
*/
public class FileRequestHandler implements Serializable, InvocationHandler {
/**
*
*/
private static final long serialVersionUID = -2633528184124692029L;
private HttpServletRequest req;
private boolean isMultipart;
private int maxMemorySize;
private String tempDirectory;
private long maxFileSize;
private Map fileMap = new HashMap();
private Map paraMap = new HashMap();
private Map readOnlyParaMap;
private FileRequestHandler(HttpServletRequest req) throws FileUploadException{
this.req = req;
}
private void parseRequest() throws FileUploadException {
if(req != null){
isMultipart = ServletFileUpload.isMultipartContent(req);
}
if(isMultipart){
//Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
if(maxMemorySize > 0){
factory.setSizeThreshold(maxMemorySize);
}
if (tempDirectory != null) {
File tmpDir = new File(tempDirectory);
if (tmpDir.exists() && tmpDir.isDirectory()
&& tmpDir.canWrite()) {
factory.setRepository(tmpDir);
}
}
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
if(maxFileSize > 0){
upload.setSizeMax(maxFileSize);
}
// Parse the request
List /* FileItem */ items = upload.parseRequest(req);
Map tmpParaMap = new HashMap();
Map tmpFileMap = new HashMap();
for(Iterator it = items.iterator(); it.hasNext();){
FileItem item = (FileItem) it.next();
//if(item.isFormField()){
List list1 = (List) tmpParaMap.get(item.getFieldName());
if(list1 == null){
list1 = new ArrayList();
tmpParaMap.put(item.getFieldName(), list1);
}
String vl = null;
if(item.isFormField()){
try {
vl = req.getCharacterEncoding() == null ? item.getString() : item.getString(req.getCharacterEncoding());
} catch (UnsupportedEncodingException e) {
//e.printStackTrace();
}
}else{
vl = item.getName();
}
list1.add(vl);
//}//else{
List list2 = (List) tmpFileMap.get(item.getFieldName());
if(list2 == null){
list2 = new ArrayList();
tmpFileMap.put(item.getFieldName(), list2);
}
list2.add(item);
//}
}
if(tmpParaMap.size() > 0){
for (Iterator it = tmpParaMap.entrySet().iterator(); it.hasNext();){
Entry en = (Entry) it.next();
List vl = (List)en.getValue();
paraMap.put(en.getKey(), vl.toArray(new String[vl.size()]));
}
}
if(tmpFileMap.size() > 0){
for(Iterator it = tmpFileMap.entrySet().iterator(); it.hasNext();){
Entry en = (Entry) it.next();
List vl = (List) en.getValue();
fileMap.put(en.getKey(), vl.toArray(new FileItem[vl.size()]));
}
}
readOnlyParaMap = Collections.unmodifiableMap(paraMap);
}
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(req == null){
return null;
}
if(isMultipart){
String mName = method.getName();
if (mName.equals("getParameter")) {
String para = (String) args[0];
return getParameter(para);
}else if(mName.equals("getParameterValues")){
String para = (String) args[0];
return (String[]) paraMap.get(para);
}else if(mName.equals("getParameterMap")){
return readOnlyParaMap;
}else if(mName.equals("getParameterNames")){
return getParameterNames();
}else if(mName.equals("getFileParameter")){
String para = (String) args[0];
return getFileParameter(para);
}else if(mName.equals("getFileParameterValues")){
String para = (String) args[0];
return fileMap.get(para);
}
}
return method.invoke(req, args);
}
/**
* overwrite HttpServletRequest.getParameterNames(String) method.
* @return
*/
public Enumeration getParameterNames(){
Enumeration names = new Enumeration(){
private Iterator it = paraMap.keySet().iterator();
public boolean hasMoreElements() {
return it.hasNext();
}
public Object nextElement() {
return it.next();
}
};
return names;
}
/**
* overwrite FileHttpServletRequest.getFileParameter(String) method.
* @param key
* @return
*/
public FileItem getFileParameter(String key){
FileItem[] fs = (FileItem[]) fileMap.get(key);
if(fs != null && fs.length > 0){
return fs[0];
}
return null;
}
/**
* overwrite HttpServletRequest.getParameter(String) method.
* @param key
* @return
*/
public String getParameter(String key){
String[] vs = (String[]) paraMap.get(key);
if(vs != null && vs.length > 0){
return vs[0];
}
return null;
}
/**
* parse request
* @param req
* @return
* @throws FileUploadException
*/
public static FileHttpServletRequest fileParse(HttpServletRequest req)
throws FileUploadException {
return fileParse(req, -1, null, -1);
}
/**
* parse request
* @param req
* @return
* @throws FileUploadException
*/
public static FileHttpServletRequest fileParse(HttpServletRequest req,
int maxMemorySize, String tempDirectory, int maxFileSize)
throws FileUploadException {
FileRequestHandler handler = new FileRequestHandler(req);
handler.maxFileSize = maxFileSize;
handler.maxMemorySize = maxMemorySize;
handler.tempDirectory = tempDirectory;
handler.parseRequest();
FileHttpServletRequest req1 = (FileHttpServletRequest) Proxy
.newProxyInstance(FileRequestHandler.class.getClassLoader(),
new Class[] { FileHttpServletRequest.class }, handler);
return req1;
}
}
如何使用: 使用的是创建模式中的工厂方法模式, 我们可以如此创建, FileHttpServletRequest req = FileRequestHandler.fileParse(request); 接下来就可以象使用request一样使用它了.