JSF: 1.2
服务器: Weblogic
我正在尝试实现多个文件上传。由于需要支持IE7,因此无法使用HTML5输入文件。因此,我计划添加一个按钮,单击该按钮将在页面中添加一个输入文件。
首先,我开始使用ADF Faces工作。但这没有用。那表现出意想不到的方式。
我还尝试了Tomahawk的文件上传组件,但是问题在于该组件,从后端添加了新文件上传后,以前创建的文件上传字段为空。不是UploadedFile
实例。但这不能满足我的要求。因为我需要显示文件上传器中的所有路径,直到单击最后一个“提交表单”按钮。
然后,我得到了Apache Commons Fileupload的帮助。
我已经使用纯JSP尝试了此操作,并安装了fileupload,效果很好。
但是我想用apches文件上传来用JSF来实现它,而当我试图这样做时,它开始引起问题。
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>
我创建了一个过滤器,因为无法从action
事件中获取正确的多部分请求。
web.xml是:
<?xml version = '1.0' encoding = 'windows-1252'?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<filter>
<filter-name>UploadFilter</filter-name>
<filter-class>com.edfx.massupload.filter.UploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UploadFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/home.jspx</welcome-file>
</welcome-file-list>
</web-app>
UploadFilter:
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);
}
}
最后是托管bean:
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
public class UploadBean {
public UploadBean() {
super();
}
public String upload() {
System.out.println("====JYM");
HttpServletRequest httpRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
System.out.println(httpRequest.getAttribute("files"));
return "";
}
}
我的目标是通过JavaScript或jQuery动态添加输入文件字段,在JSP中效果很好,我想在JSF中获得它。
如果我enctype="multipart/form-data"
从中删除,h:form
则该action方法正在执行,否则不会执行。
任何建议对我都会很有帮助。
这里,
for (FileItem item : items) {
if (!item.isFormField()) {
files.add(item);
}
}
您将忽略所有表单字段,例如按钮本身。当继续这样的请求时,JSF将不知道按钮已被调用,因此根本不会排队任何操作。
您需要添加一个,else
以将中的所有表单字段收集Map<String, String[]>
起来,并使用来包装请求,该请求HttpServletRequestWrapper
在所有getParameterXxx()
调用中均委托给该映射,最后使用已包装的请求继续过滤链。这样,JSF将发现按钮已被调用,然后排队执行适当的操作。
问题内容: HTML表单是什么意思,什么时候应该使用它? 问题答案: 发出POST请求时,必须以某种方式对构成请求主体的数据进行编码。 HTML表单提供了三种编码方法。 (默认) 正在进行添加的工作,但已被放弃。 (使用HTML表单提交以外的其他方式生成的HTTP请求也可以使用其他编码。JSON是用于Web服务的常见格式,有些仍然使用SOAP。) 格式的细节对大多数开发人员而言并不重要。要点是:
我不知道为什么不能让jQuery传递上传数据,因为AJAX对象似乎配置正确,并且发送了正确的content-type/mime-type头部。 我尝试了两种不同的请求形式--一种是将FormData对象包含在文本中,另一种是直接传递FormData对象。 不幸的是,不管怎样,我都无法传递任何内容,$_files和$_post都是空数组。
问题内容: 我想在JavaScript中使用XMLHttpRequest来发布包含文件类型输入元素的表单,以便避免页面刷新并返回有用的XML。 我可以使用JavaScript将表单上的目标属性设置为MSIE的iframe或Mozilla的对象,而无需刷新页面即可提交表单,但这有两个问题。较小的问题是目标与W3C不兼容(这就是为什么我在JavaScript中而不是在XHTML中设置目标)。主要问题是
问题内容: 我正在开发使用不同服务其余部分的图形界面(用Java编写)。我必须调用这样的服务: 呼叫服务: 当我从Angularjs服务文件中请求时,如果服务具有Content-Type = multipart / form- data,则会收到错误400(错误请求) 如果服务的Content-Type =“ application / x-www-form-urlencoded; charset
问题内容: 我创建了一个隐藏的表单元素 而且我正在尝试在servlet中通过此行获取值(如我之前所做的那样): 但是我明白了(第33行是上面的行): java.lang.NumberFormatException:null java.lang.Integer.parseInt(未知源)java.lang.Integer.parseInt(未知源)web.objects.UploadImage.do
我需要将照片和访问令牌传递给后端REST服务。内容类型 is Multipart/form-data我创建了html表单和操作是esb的endpoint,我已经跟踪了通往ESB[A]和从ESB[B]出去的流量。这似乎幻灯片上的变化,我不知道解决这个问题。当我将捕获的流量发送到ESB[A]时,后端服务会接受它。但是由ESB[B]输出的流量不被后端接受。表示不识别边界中的值。上面写着“价值观是空的”