问题描述
我正在尝试上传带有 primefaces 的图像,但未调用 fileUploadListener.
I am trying to upload an image with primefaces and the fileUploadListener is not invoked.
<h:form enctype="multipart/form-data">
<p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}"
mode="advanced"
update="messages"
sizeLimit="100000"
allowTypes="/(.|/)(gif|jpe?g|png)$/"/>
<p:growl id="messages" showDetail="true"/>
这是豆子:
@ManagedBean
@RequestScoped
public class FileUploadController {
public void handleFileUpload(FileUploadEvent event) throws Exception {
System.out.println("OOOOOOOOOOOOOOOOOOK");
File targetFolder = new File("C:/Uploads");
InputStream inputStream = event.getFile().getInputstream();
OutputStream out = new FileOutputStream(new File(targetFolder,
event.getFile().getFileName()));
int read = 0;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
inputStream.close();
out.flush();
out.close();
}
}
这里是 web.xml 配置:
And here is the web.xml configuration:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 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_3_0.xsd">
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<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>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
</web-app>
我还在类路径中添加了 commons-fileupload 和 Commons-io jar.我不明白为什么不调用 handleFileUpload.
I have also added the commons-fileupload and Commons-io jars in the classpath.I am not understanding why the the handleFileUpload is not invoked.
推荐答案
您已明确配置文件上传过滤器以仅侦听 FORWARD
调度程序.
You've explicitly configured the file upload filter to listen on FORWARD
dispatcher only.
您需要从过滤器映射中删除以下条目,以便它默认仅在 REQUEST
调度程序上侦听:
You need either to remove the following entry from the filter mapping so that it listens by default on the REQUEST
dispatcher only:
<dispatcher>FORWARD</dispatcher>
或者,将 REQUEST
调度程序添加到过滤器映射,以便它也可以在正常请求上运行:
Or, to add the REQUEST
dispatcher to the filter mapping so that it would run on normal requests as well:
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
FORWARD
调度程序仅在 RequestDispatcher#forward()
被调用之前过滤器是调用.例如,通过一些 URL 重写解决方案,例如 PrettyFaces.到目前为止,问题中提供的信息似乎并未以任何方式表明您正在使用该信息.
The FORWARD
dispatcher is only mandatory when RequestDispatcher#forward()
is been called before the filter is invoked. For example, by some URL rewriting solution such as PrettyFaces. The information provided so far in the question does however not seem to indicate in any way that you're using that.
与具体问题无关,由于 PrimeFaces 文件上传需要 Apache Commons IO,您可能需要考虑使用 IOUtils#copy()
而不是那种冗长的输入/输出流循环.另请参阅:如何在 JSF 中保存上传的文件.
Unrelated to the concrete problem, as the PrimeFaces file upload requires Apache Commons IO, you may want to consider to IOUtils#copy()
instead of that verbose input/output stream loop. See also: How to save uploaded file in JSF.
这篇关于p:fileUpload 中的侦听器方法永远不会在 primefaces 中调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!