Java 如果h:form具有enctype=";“多部分/表单数据”;
JSF:1.2 服务器:Weblogic 我正在尝试实现多文件上传。因为我需要支持IE7,所以我不能使用HTML5输入文件。所以我计划添加一个按钮,点击它会在页面中添加一个输入文件 我主要是从ADF Faces开始工作的。但那没用。这是一种意想不到的行为 我也尝试过Tomahawk的文件上传组件,但是这个组件的问题是,在从后端添加新的文件上传后,先前创建的文件上传字段变为空;不是上载的Java 如果h:form具有enctype=";“多部分/表单数据”;,java,jsf,file-upload,jsf-1.2,apache-commons-fileupload,Java,Jsf,File Upload,Jsf 1.2,Apache Commons Fileupload,JSF:1.2 服务器:Weblogic 我正在尝试实现多文件上传。因为我需要支持IE7,所以我不能使用HTML5输入文件。所以我计划添加一个按钮,点击它会在页面中添加一个输入文件 我主要是从ADF Faces开始工作的。但那没用。这是一种意想不到的行为 我也尝试过Tomahawk的文件上传组件,但是这个组件的问题是,在从后端添加新的文件上传后,先前创建的文件上传字段变为空;不是上载的文件实例。但这不符合我的要求。因为我需要显示文件上传器中的所有路径,直到单击最终提交表单按钮为止 然后,我借助A
文件
实例。但这不符合我的要求。因为我需要显示文件上传器中的所有路径,直到单击最终提交表单按钮为止
然后,我借助ApacheCommonsFileUpload
我已经用纯JSP和apaches文件上传尝试过了,效果很好
但是我想用JSF和apaches fileupload来实现它,当我尝试这样做时,它开始引起问题
jspx页面如下所示:
<?xml version='1.0' encoding='utf-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<jsp:output omit-xml-declaration="true" doctype-root-element="HTML"
doctype-system="http://www.w3.org/TR/html4/loose.dtd"
doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"/>
<jsp:directive.page contentType="text/html;charset=utf-8"/>
<f:view>
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=utf-8"/>
<title>home</title>
</head>
<body>
<h:form enctype="multipart/form-data">
<input type="file" name="file"/>
<h:commandButton value="Upload" action="#{uploadBean.upload}" />
</h:form>
</body>
</html>
</f:view>
</jsp:root>
上载筛选器:
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
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;
public class UploadFilter implements Filter {
private FilterConfig _filterConfig = null;
public void init(FilterConfig filterConfig) throws ServletException {
_filterConfig = filterConfig;
}
public void destroy() {
_filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("Filter");
if (!(request instanceof HttpServletRequest)) {
chain.doFilter(request, response);
return;
}
HttpServletRequest httpRequest = (HttpServletRequest)request;
boolean isMultipartContent = ServletFileUpload.isMultipartContent(httpRequest);
if (!isMultipartContent) {
chain.doFilter(request, response);
return;
}
long maxFileSize = (1024 * 1024 * 1024);
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
upload.setSizeMax(maxFileSize);
upload.setFileSizeMax(maxFileSize);
try {
List<FileItem> items = upload.parseRequest(httpRequest);
System.out.println(items.size());
List<FileItem> files = new ArrayList<FileItem>();
for (FileItem item : items) {
if (!item.isFormField()) {
files.add(item);
}
}
httpRequest.setAttribute("files", files);
} catch (FileUploadException ex) {
ex.printStackTrace();
}
chain.doFilter(request, response);
}
}
我的目标是通过JavaScript或jQuery动态添加输入文件字段,这在JSP中运行良好,我希望在JSF中实现这一点
如果我从h:form
中删除enctype=“multipart/form data”
,则操作方法正在执行,否则不会执行
任何建议都会对我很有帮助。这里
for (FileItem item : items) {
if (!item.isFormField()) {
files.add(item);
}
}
您将忽略所有表单字段,例如按钮本身。当继续这样一个请求时,JSF将不知道是否调用了按钮,因此根本不会对任何操作排队
您需要添加一个else
来收集Map
中的所有表单字段,并使用HttpServletRequestWrapper
包装请求,该包装将在所有getParameterXxx()
调用中委托给该映射,最后使用包装的请求继续过滤链。通过这种方式,JSF将发现按钮已被调用,然后排队等待正确的操作。如@BalusC所示:
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadFilter implements Filter {
private FilterConfig filterConfig = null;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
public void destroy() {
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (!(request instanceof HttpServletRequest)) {
chain.doFilter(request, response);
return;
}
HttpServletRequest httpRequest = (HttpServletRequest)request;
boolean isMultipartContent = ServletFileUpload.isMultipartContent(httpRequest);
if (!isMultipartContent) {
chain.doFilter(request, response);
return;
}
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
upload.setSizeMax(-1);
List<FileItem> items = upload.parseRequest(httpRequest);
final Map<String, String[]> parameterMap = new HashMap<String, String[]>();
for (FileItem item : items) {
if (item.isFormField()) {
processFormField(item, parameterMap);
} else {
processFileField(item, httpRequest);
}
}
chain.doFilter(new HttpServletRequestWrapper(httpRequest) {
public Map<String, String[]> getParameterMap() {
return parameterMap;
}
public String[] getParameterValues(String name) {
return (String[])parameterMap.get(name);
}
public String getParameter(String name) {
String[] params = getParameterValues(name);
if (params == null) {
return null;
}
return params[0];
}
public Enumeration<String> getParameterNames() {
return Collections.enumeration(parameterMap.keySet());
}
}, response);
} catch (Exception ex) {
ServletException servletException = new ServletException();
servletException.initCause(ex);
throw servletException;
}
}
private void processFormField(FileItem formField, Map<String, String[]> parameterMap) {
String name = formField.getFieldName();
String value = formField.getString();
String[] values = parameterMap.get(name);
if (values == null) {
parameterMap.put(name, new String[] { value });
} else {
int length = values.length;
String[] newValues = new String[length + 1];
System.arraycopy(values, 0, newValues, 0, length);
newValues[length] = value;
parameterMap.put(name, newValues);
}
}
private void processFileField(FileItem fileField, HttpServletRequest request) {
if (request.getAttribute(fileField.getFieldName()) == null) {
List<FileItem> fileFields = new ArrayList<FileItem>(0);
fileFields.add(fileField);
request.setAttribute(fileField.getFieldName(), fileFields);
} else {
List<FileItem> fileFields = (List<FileItem>)request.getAttribute(fileField.getFieldName());
fileFields.add(fileField);
}
}
}
import java.io.IOException;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.Enumeration;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入javax.servlet.Filter;
导入javax.servlet.FilterChain;
导入javax.servlet.FilterConfig;
导入javax.servlet.ServletException;
导入javax.servlet.ServletRequest;
导入javax.servlet.ServletResponse;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletRequestWrapper;
导入org.apache.commons.fileupload.FileItem;
导入org.apache.commons.fileupload.disk.DiskFileItemFactory;
导入org.apache.commons.fileupload.servlet.ServletFileUpload;
公共类UploadFilter实现过滤器{
private FilterConfig FilterConfig=null;
public void init(FilterConfig FilterConfig)抛出ServletException{
this.filterConfig=filterConfig;
}
公共空间销毁(){
this.filterConfig=null;
}
public void doFilter(ServletRequest请求、ServletResponse响应、FilterChain链)抛出IOException、ServletException{
if(!(HttpServletRequest的请求实例)){
链式过滤器(请求、响应);
返回;
}
HttpServletRequest httpRequest=(HttpServletRequest)请求;
布尔值isMultipartContent=ServletFileUpload.isMultipartContent(httpRequest);
如果(!isMultipartContent){
链式过滤器(请求、响应);
返回;
}
试一试{
DiskFileItemFactory=新的DiskFileItemFactory();
ServletFileUpload upload=新的ServletFileUpload(工厂);
上传。setHeaderEncoding(“UTF-8”);
upload.setSizeMax(-1);
列表项=upload.parseRequest(httpRequest);
最终映射参数Map=newhashmap();
用于(文件项:项){
if(item.isFormField()){
processFormField(项,参数映射);
}否则{
processFileField(项目,httpRequest);
}
}
doFilter(新的HttpServletRequestWrapper(httpRequest){
公共映射getParameterMap(){
返回参数map;
}
公共字符串[]getParameterValues(字符串名称){
返回(字符串[])参数map.get(名称);
}
公共字符串getParameter(字符串名称){
字符串[]params=getParameterValues(名称);
if(params==null){
返回null;
}
返回参数[0];
}
公共枚举getParameterNames(){
返回Collections.enumeration(parameterMap.keySet());
}
},回应);
}捕获(例外情况除外){
ServletException ServletException=新ServletException();
servletException.initCause(ex);
抛出servletException;
}
}
私有void processFormField(FileItem formField,映射参数Map){
字符串名称=formField.getFieldName();
字符串值=formField.getString();
字符串[]值=parameterMap.get(名称);
如果(值==null){
parameterMap.put(名称,新字符串[]{value});
}否则{
int length=values.length;
字符串[]newValues=新字符串[长度+1];
数组复制(值,0,新值,0,长度);
newValues[length]=值;
parameterMap.put(名称、新值);
}
}
私有void processFileField(FileItem fileField,HttpServletRequest){
for (FileItem item : items) {
if (!item.isFormField()) {
files.add(item);
}
}
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadFilter implements Filter {
private FilterConfig filterConfig = null;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
public void destroy() {
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (!(request instanceof HttpServletRequest)) {
chain.doFilter(request, response);
return;
}
HttpServletRequest httpRequest = (HttpServletRequest)request;
boolean isMultipartContent = ServletFileUpload.isMultipartContent(httpRequest);
if (!isMultipartContent) {
chain.doFilter(request, response);
return;
}
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
upload.setSizeMax(-1);
List<FileItem> items = upload.parseRequest(httpRequest);
final Map<String, String[]> parameterMap = new HashMap<String, String[]>();
for (FileItem item : items) {
if (item.isFormField()) {
processFormField(item, parameterMap);
} else {
processFileField(item, httpRequest);
}
}
chain.doFilter(new HttpServletRequestWrapper(httpRequest) {
public Map<String, String[]> getParameterMap() {
return parameterMap;
}
public String[] getParameterValues(String name) {
return (String[])parameterMap.get(name);
}
public String getParameter(String name) {
String[] params = getParameterValues(name);
if (params == null) {
return null;
}
return params[0];
}
public Enumeration<String> getParameterNames() {
return Collections.enumeration(parameterMap.keySet());
}
}, response);
} catch (Exception ex) {
ServletException servletException = new ServletException();
servletException.initCause(ex);
throw servletException;
}
}
private void processFormField(FileItem formField, Map<String, String[]> parameterMap) {
String name = formField.getFieldName();
String value = formField.getString();
String[] values = parameterMap.get(name);
if (values == null) {
parameterMap.put(name, new String[] { value });
} else {
int length = values.length;
String[] newValues = new String[length + 1];
System.arraycopy(values, 0, newValues, 0, length);
newValues[length] = value;
parameterMap.put(name, newValues);
}
}
private void processFileField(FileItem fileField, HttpServletRequest request) {
if (request.getAttribute(fileField.getFieldName()) == null) {
List<FileItem> fileFields = new ArrayList<FileItem>(0);
fileFields.add(fileField);
request.setAttribute(fileField.getFieldName(), fileFields);
} else {
List<FileItem> fileFields = (List<FileItem>)request.getAttribute(fileField.getFieldName());
fileFields.add(fileField);
}
}
}