package com.jsfx.filter;
import java.io.File;
import java.io.UnsupportedEncodingException;
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 javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Request的包装类,使jsf能解析表单数据 代码主要来自myFaces1.1的MultipartRequestWrapper类
* 主要区别是使用了commons-fileupload1.2处理文件上传
*/
@SuppressWarnings("unchecked")
public class MultipartRequestWrapper extends HttpServletRequestWrapper {
public static final String UPLOADED_FILES_ATTRIBUTE = "org.apache.myfaces.uploadedFiles";
public static final String WWW_FORM_URLENCODED_TYPE = "application/x-www-form-urlencoded";
HttpServletRequest request = null;
HashMap parametersMap = null;// 参数表
ServletFileUpload fileUpload = null;
HashMap fileItems = null;// 上传文件表
int maxSize;// 表单最大大小
int thresholdSize;// 临界值大小
String repositoryPath;// 临时文件夹位置
public MultipartRequestWrapper(HttpServletRequest request, int maxSize,
int thresholdSize, String repositoryPath) {
super(request);
this.request = request;
this.maxSize = maxSize;
this.thresholdSize = thresholdSize;
this.repositoryPath = repositoryPath;
}
@Override
public Enumeration getParameterNames() {
if (parametersMap == null)
parseRequest();
return Collections.enumeration(parametersMap.keySet());
}
@Override
public String getParameter(String name) {
if (parametersMap == null)
parseRequest();
String[] values = (String[]) parametersMap.get(name);
if (values == null)
return null;
return values[0];
}
@Override
public String[] getParameterValues(String name) {
if (parametersMap == null)
parseRequest();
return (String[]) parametersMap.get(name);
}
@Override
public Map getParameterMap() {
if (parametersMap == null)
parseRequest();
return parametersMap;
}
/**
* 获取请求中的FileItem
*/
public FileItem getFileItem(String fieldName) {
if (fileItems == null)
parseRequest();
return (FileItem) fileItems.get(fieldName);
}
/**
* 获取请求中的FileItem表
*/
public Map getFileItems() {
if (fileItems == null)
parseRequest();
return fileItems;
}
@Override
public Object getAttribute(String string) {
if (string.equals(UPLOADED_FILES_ATTRIBUTE)) {
return getFileItems();
}
return super.getAttribute(string);
}
@Override
public String getContentType() {
return WWW_FORM_URLENCODED_TYPE;
}
/**
* 最关键的部分,解析表单数据
*/
private void parseRequest() {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(thresholdSize);// 设置临届大小
if (repositoryPath != null && repositoryPath.trim().length() > 0)
factory.setRepository(new File(repositoryPath));// 设置临时文件夹
fileUpload = new ServletFileUpload();
fileUpload.setFileItemFactory(factory);
fileUpload.setSizeMax(maxSize);// 设置表单最大大小
String charset = request.getCharacterEncoding();
fileUpload.setHeaderEncoding(charset);
List requestParameters = null;
try {
requestParameters = fileUpload.parseRequest(request);
} catch (FileUploadBase.SizeLimitExceededException e) {
e.printStackTrace();
FacesContext.getCurrentInstance().addMessage("",
new FacesMessage(e.getMessage()));// 文件超过大小时提示用户
requestParameters = Collections.EMPTY_LIST;
} catch (FileUploadException fue) {
fue.printStackTrace();
FacesContext.getCurrentInstance().addMessage("",
new FacesMessage(fue.getMessage()));
requestParameters = Collections.EMPTY_LIST;
}
parametersMap = new HashMap(requestParameters.size());// 建立参数表
fileItems = new HashMap();
for (Iterator iter = requestParameters.iterator(); iter.hasNext();) {
FileItem fileItem = (FileItem) iter.next();
if (fileItem.isFormField()) {// 普通参数处理
String name = fileItem.getFieldName();
String value = null;
if (charset == null) {
value = fileItem.getString();
} else {
try {
value = new String(fileItem.get(), charset);
} catch (UnsupportedEncodingException e) {
value = fileItem.getString();
}
}
addTextParameter(name, value);// 添加参数
} else {// 参数是一个文件
if (fileItem.getName() != null) {
fileItems.put(fileItem.getFieldName(), fileItem);// 添加Fileitem
}
}
}
for (Iterator it = request.getParameterMap().entrySet().iterator(); it
.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
Object value = entry.getValue();
if (value instanceof String[]) {
String[] valuesArray = (String[]) entry.getValue();
for (int i = 0; i < valuesArray.length; i++) {
addTextParameter((String) entry.getKey(), valuesArray[i]);
}
} else if (value instanceof String) {
String strValue = (String) entry.getValue();
addTextParameter((String) entry.getKey(), strValue);
} else if (value != null)
throw new IllegalStateException("value of type : "
+ value.getClass() + " for key : " + entry.getKey()
+ " cannot be handled.");
}
}
private void addTextParameter(String name, String value) {
if (!parametersMap.containsKey(name)) {
String[] valuesArray = { value };
parametersMap.put(name, valuesArray);
} else {
String[] storedValues = (String[]) parametersMap.get(name);
int lengthSrc = storedValues.length;
String[] valuesArray = new String[lengthSrc + 1];
System.arraycopy(storedValues, 0, valuesArray, 0, lengthSrc);
valuesArray[lengthSrc] = value;
parametersMap.put(name, valuesArray);
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
JSF自定义文件上传组件
共35个文件
class:8个
java:8个
jar:7个
4星 · 超过85%的资源 需积分: 34 209 下载量 179 浏览量
2008-09-18
22:02:30
上传
评论 5
收藏 1.84MB RAR 举报
温馨提示
jsf官方实现默认是不支持multipart/form-data类型的表单的,为了使jsf能够解析multipart/form-data表单的数据,我参考了myfaces1.1的方式,然后按照commons-fileupload1.2重构了部分代码(myfaces1.1使用的是commons-fileupload1.1)开发了一个文件上传组件。
资源详情
资源评论
资源推荐
收起资源包目录
jsf自定义文件上传.rar (35个子文件)
jsf自定义文件上传
jsfx.jar 15KB
JSFX
WebRoot
WEB-INF
web.xml 1KB
faces-config.xml 752B
lib
commons-fileupload.jar 53KB
jstl-1.2.jar 405KB
commons-io.jar 82KB
jsfx.jar 15KB
jsf-api.jar 314KB
jsf-impl.jar 1.15MB
classes
bean
UserBean.class 2KB
META-INF
jsfx.tld 2KB
faces-config.xml 751B
.faces-config.mex 147B
com
jsfx
fileupload
HtmlUpload.class 3KB
UploadedFile.class 2KB
UploadRenderer.class 5KB
UploadedFileConverter.class 1KB
UploadTag.class 4KB
filter
MultipartRequestWrapper.class 7KB
MultipartFilter.class 3KB
index.jsp 35B
upload.jsp 2KB
META-INF
MANIFEST.MF 39B
showPicture.jsp 753B
src
bean
UserBean.java 1KB
META-INF
jsfx.tld 2KB
faces-config.xml 751B
.faces-config.mex 147B
com
jsfx
fileupload
UploadTag.java 4KB
UploadRenderer.java 4KB
HtmlUpload.java 3KB
UploadedFile.java 1KB
UploadedFileConverter.java 655B
filter
MultipartRequestWrapper.java 6KB
MultipartFilter.java 3KB
共 35 条
- 1
chch87
- 粉丝: 23
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论11