上传文件的fileUpload和primefaces空值[重复]

Posted

技术标签:

【中文标题】上传文件的fileUpload和primefaces空值[重复]【英文标题】:fileUpload and primefaces null value for uploaded file [duplicate] 【发布时间】:2013-06-06 14:07:44 【问题描述】:

我是 primefaces 的新手,我正在尝试在我的项目中实现 fileUpload 组件。 我已经打开了文档,但对我来说并不清楚,我的实现也不起作用。

文档的第一行说:

“首先要做的是配置解析多部分请求的文件上传过滤器。文件上传过滤器应该映射到 Faces Servlet。”

有建议放这个代码:

<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>
</filter-mapping>

进入 web.xml 描述符

第一个问题: “......解析多部分请求的过滤器”。我知道这意味着如果我想上传超过 1 个文件,我应该使用该代码(我不确定)。 所以我想我应该错过,但是在我在互联网上找到的大多数示例中,应该实现此代码。

第二个问题: 当我尝试在我的 web.xml 文件中实现过滤器时:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">

<display-name>Archetype Created Web Application</display-name>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/classes/configuration-context.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

<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>
</filter-mapping>

<listener>
    <listener- class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


<!-- JSF Mapping -->
<servlet>
    <servlet-name>facesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
</servlet-mapping>

<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
</context-param>
<context-param>
    <param-name>primefaces.THEME</param-name>
    <param-value>redmond</param-value>
</context-param>

</web-app>

我收到很多错误:

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component     [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/wals]]
at java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.catalina.LifecycleException: Failed to start component     [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/wals]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
... 7 more
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Unknown Source)
at java.lang.Class.getDeclaredFields(Unknown Source)
at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:106)
at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:261)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationFilterAnnotations(WebAnnotationSet.java:110)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:66)
at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:405)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:881)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:369)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5269)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 7 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItemFactory
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
... 21 more

第三个问题: 这可能是由第一个和第二个问题引起的,但我不确定。如果我放弃过滤器代码并在 xhtml 文件中实现类似的 primefaces:

<h:form enctype="multipart/form-data">
<h:outputText value="Wybór zdjęcia: " />
<p:fileUpload value="#fileUploadController.file" mode="simple" />
<p:commandButton value="Submit" ajax="false"/>
</h:form>

fileUploadController bean 的定义简单:

@Component
@Scope("session")
@ManagedBean
@SessionScoped
public class FileUploadController
  
private UploadedFile file;

public UploadedFile getFile()

    return file;


public void setFile(UploadedFile file)

    this.file = file;


我得到文件字段的空值。我的目标是上传图像,将其更改为 Blob 并发送到数据库。 非常感谢您的帮助,因为如果没有这部分,我将无法继续我的项目。

【问题讨论】:

也许我的这个答案可以帮助很多人:***.com/a/33760453/1201725 【参考方案1】:

看起来您可能缺少一些依赖项。另一个线程上有一个类似的错误,我已经为您发布了链接here。它基本上建议您需要为 commons-fileupload 和 commons-io 添加 jar 文件。希望这可以帮助您解决问题。

【讨论】:

你是绝对正确的。我添加了这个库,没有错误。非常感谢。但是上传文件的空值仍然存在问题。我读到 2 个因素可能是问题的原因。首先我应该添加 enctype="multipart/form-data" 标签。第二个原因可能是 web.xml 的问题。因此,我将这些内容更新到我的帖子中,因为我不知道可能出了什么问题。你能帮帮我吗? @user2374573 很高兴我能提供帮助,并随时为该答案提供 1+ 分。另外,你能发布你得到的新错误吗?所以,我可以帮助你更多。我不确定您是要打开一个新线程还是将其添加到现有线程中。 很抱歉,我的分数低于 15 分,所以我不能给你 1+。我没有收到任何错误。刚刚上传后,文件字段仍然有空值,这就是问题。 现在试试 :) 我想你应该也可以。 好的。我检查了一下,似乎从未调用过 setFile 方法。【参考方案2】:

在我的情况下,问题是缺少 Faces Servlet 的定义。从 Servlet 3.0 开始,它由容器自动声明。显然 servlet 可能具有与 FacesServlet 不同的名称,这会破坏 FileUploadFilter 定义。

具体来说 - 我的问题是高级上传器没有调用监听器,也没有为简单上传器设置文件变量。

https://docs.oracle.com/javaee/6/api/javax/faces/webapp/FacesServlet.html

解决方案是在 web.xml 中声明 Faces Servlet(即使它是自动声明的)。

我的问题出现在 Jboss 7.1 和 Primefaces 5.0 上。我尝试遵循这里的所有建议,直到我意识到实际上我没有定义 Faces Servlet。由于应用程序的其他部分可以使用自动声明,因此我花了一些时间寻找解决方案。希望它可以帮助任何人。

【讨论】:

【参考方案3】:

问题是因为错误的 servlet 名称。

变化:

<servlet-name>Faces Servlet</servlet-name>

<servlet-name>facesServlet</servlet-name>

解决了这个问题。这是一个团队项目,我没有注意到名称已更改,因此请小心。感谢您的帮助。

【讨论】:

【参考方案4】:

fileUpload 和 primefaces 上传文件的 null 值

下载commons-fileupload-1.2.1.jar、commons-io-2.0.1.jar并放入WEB_INF/lib。否则在 pom.xml 文件中添加依赖项。你的问题会解决的。

【讨论】:

以上是关于上传文件的fileUpload和primefaces空值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Primefaces:fileUpload显示Facesmessage无法正常工作

如何在 PrimeFaces fileUpload 中向 fileUploadListener 发送参数

primeface中如何实现 fileupload功能,我这个怎么无效,请高人指点一下。

如何使用 PrimeReact FileUpload 组件上传文件

发生fileUpload时无法更新outputText

Primefaces fileUpload fileUploadListener问题