Wednesday, May 17, 2017

Fileupload does not work in Primefaces

Leave a Comment

I have some issues with the <p:fileUpload> in Primefaces. At first I tried the snippets in the Documentation of Fileupload starting on page 2018. The first issue was that if I use the snippet, the upload function is not called:

public void upload() {     System.out.println("This is never shown");      if(file != null) {             System.out.println("This is never shown");     } } 

html:

<h:form  enctype="multipart/form-data">     <p:fileUpload value="#{fileUploadView.file}" mode="simple" />     <p:commandButton value="Submit" action="#{fileUploadView.upload}" ajax="false"/> </h:form> 

I have tried many other snippets and solutions. Advanced mode, with fileUploadListener, deleted the enctype in h:form, ....

If I choose mode="simple" and combine it with ajax="true" the function FileUploadView.upload() is called, but the file is always NULL.

If I delete the enctype from the <h:form>, the function FileUploadView.upload() is called, but the file is always NULL.

I mention the issues above, because this should not work either, because I read all possible solutions on this forum. I also added all suggested dependencies and context-params and filter, but it does not work.

Here I will post my pom.xml, web.xml and the full .java code: pom.xml

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">     <modelVersion>4.0.0</modelVersion>      <groupId>at.qe</groupId>     <artifactId>ASN_Application</artifactId>     <version>1.0.0</version>     <packaging>war</packaging>       <name>ASN_Application</name>     <description>     </description>      <repositories>         <repository>             <id>prime-repo</id>             <name>Prime Repo</name>             <url>http://repository.primefaces.org</url>         </repository>           <repository>             <id>spring-releases</id>             <url>https://repo.spring.io/libs-release</url>         </repository>      </repositories>     <pluginRepositories>         <pluginRepository>             <id>spring-releases</id>             <url>https://repo.spring.io/libs-release</url>         </pluginRepository>     </pluginRepositories>      <parent>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-parent</artifactId>         <version>1.4.1.RELEASE</version>     </parent>      <properties>         <start-class>at.qe.sepm.asn_app.Main</start-class>         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>     </properties>      <dependencies>         <dependency>             <groupId>commons-io</groupId>             <artifactId>commons-io</artifactId>             <version>2.5</version>          </dependency>         <dependency>             <groupId>commons-fileupload</groupId>             <artifactId>commons-fileupload</artifactId>             <version>1.3.2</version>         </dependency>         <dependency>             <groupId>org.primefaces.themes</groupId>             <artifactId>all-themes</artifactId>             <version>1.0.10</version>         </dependency>          <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-data-jpa</artifactId>         </dependency>         <dependency>             <groupId>com.h2database</groupId>             <artifactId>h2</artifactId>             <scope>runtime</scope>         </dependency>          <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-web</artifactId>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-actuator</artifactId>         </dependency>         <dependency>             <groupId>org.glassfish.web</groupId>             <artifactId>el-impl</artifactId>             <version>2.2</version>         </dependency>         <dependency>             <groupId>javax.enterprise</groupId>             <artifactId>cdi-api</artifactId>             <version>2.0-PFD2</version>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-security</artifactId>         </dependency>         <dependency>             <groupId>com.sun.faces</groupId>             <artifactId>jsf-api</artifactId>             <version>2.2.14</version>             <scope>compile</scope>         </dependency>         <dependency>             <groupId>com.sun.faces</groupId>             <artifactId>jsf-impl</artifactId>             <version>2.2.13</version>             <scope>compile</scope>             <optional>true</optional>         </dependency>         <dependency>             <groupId>org.apache.tomcat.embed</groupId>             <artifactId>tomcat-embed-core</artifactId>             <scope>compile</scope>         </dependency>         <dependency>             <groupId>org.apache.tomcat.embed</groupId>             <artifactId>tomcat-embed-jasper</artifactId>             <scope>compile</scope>         </dependency>         <dependency>             <groupId>org.primefaces</groupId>             <artifactId>primefaces</artifactId>             <version>6.1</version>         </dependency>          <dependency>             <groupId>org.apache.poi</groupId>             <artifactId>poi</artifactId>             <version>3.16</version>         </dependency>         <dependency>             <groupId>com.lowagie</groupId>             <artifactId>itext</artifactId>             <version>2.1.7</version>         </dependency>          <!-- special test dependencies -->         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-test</artifactId>             <scope>test</scope>         </dependency>         <dependency>             <groupId>org.springframework.security</groupId>             <artifactId>spring-security-test</artifactId>             <scope>test</scope>         </dependency>         <dependency>             <groupId>nl.jqno.equalsverifier</groupId>             <artifactId>equalsverifier</artifactId>             <version>2.1.6</version>             <scope>test</scope>         </dependency>         <dependency>             <groupId>mysql</groupId>             <artifactId>mysql-connector-java</artifactId>             <version>6.0.6</version>         </dependency>      </dependencies>      <build>         <plugins>             <plugin>                 <artifactId>maven-compiler-plugin</artifactId>                 <configuration>                     <source>1.8</source>                     <target>1.8</target>                 </configuration>             </plugin>             <!-- Enable jacoco analysis -->             <plugin>                 <groupId>org.apache.maven.plugins</groupId>                 <artifactId>maven-surefire-plugin</artifactId>                 <configuration>                     <forkMode>once</forkMode>                     <argLine>                         ${coverageAgent}                     </argLine>                     <useSystemClassLoader>true</useSystemClassLoader>                 </configuration>             </plugin>             <plugin>                 <groupId>org.jacoco</groupId>                 <artifactId>jacoco-maven-plugin</artifactId>                 <version>0.7.6.201602180812</version>                 <configuration>                     <propertyName>coverageAgent</propertyName>                 </configuration>                 <executions>                     <execution>                         <goals>                             <goal>prepare-agent</goal>                         </goals>                     </execution>                     <execution>                         <id>report</id>                         <phase>prepare-package</phase>                         <goals>                             <goal>report</goal>                         </goals>                     </execution>                 </executions>             </plugin>         </plugins>     </build> </project> 

web.xml

<?xml version="1.0" encoding="UTF-8"?> <web-app 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_2_5.xsd"          version="2.5">      <servlet>         <servlet-name>Faces Servlet</servlet-name>         <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>         <load-on-startup>1</load-on-startup>     </servlet>      <error-page>         <exception-type>org.springframework.security.access.AccessDeniedException</exception-type>         <location>/error/access_denied.xhtml</location>     </error-page>       <context-param>         <param-name>javax.faces.STATE_SAVING_METHOD</param-name>         <param-value>server</param-value>     </context-param>     <context-param>         <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>         <param-value>true</param-value>     </context-param>  <context-param>     <param-name>primefaces.FONT_AWESOME</param-name>     <param-value>true</param-value> </context-param>  <context-param>     <param-name>primefaces.UPLOADER</param-name>     <param-value>commons</param-value>   </context-param>   <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>     <mime-mapping>     <extension>eot</extension>     <mime-type>application/vnd.ms-fontobject</mime-type> </mime-mapping> <mime-mapping>       <extension>otf</extension>       <mime-type>font/opentype</mime-type>   </mime-mapping>       <mime-mapping>       <extension>ttf</extension>       <mime-type>application/x-font-ttf</mime-type>   </mime-mapping>       <mime-mapping>       <extension>woff</extension>       <mime-type>application/x-font-woff</mime-type>   </mime-mapping> <mime-mapping>       <extension>svg</extension>       <mime-type>image/svg+xml</mime-type>   </mime-mapping>      <servlet-mapping>         <servlet-name>Faces Servlet</servlet-name>         <url-pattern>*.xhtml</url-pattern>     </servlet-mapping>      <welcome-file-list>         <welcome-file>login.xhtml</welcome-file>     </welcome-file-list> </web-app> 

FileUploadView.java

@Component @Scope("view")     public class FileUploadView{         @Autowired         private PictureService pictureService;         @Autowired         private UserRepository userRepository;         @Autowired         private AuditLogRepository auditLogRepository;         private Picture picture;         private UploadedFile file;          public Picture getPicture(){             return picture;         }          public void setPicture(Picture picture){             this.picture = picture;         }           public UploadedFile getFile() {             return file;         }          public void setFile(UploadedFile file) {             this.file = file;         }         @PostConstruct         public void init(){             file= new DefaultUploadedFile();         }          public void upload() {              if(file != null) {                 try{                     System.out.println("This is never shown");                      AuditLog log = new AuditLog(getAuthenticatedUser().getUsername(),"PICTURE UPLOADED: " + getAuthenticatedUser().getUsername() + " [" + getAuthenticatedUser().getUserRole() + "] ", new Date());                     auditLogRepository.save(log);                     System.out.println(file.getFileName());                     picture = new Picture(file.getFileName(), userRepository.findFirstByUsername(auth.getName()), new Date(), file.getFileName());                     pictureService.savePicture(picture);                 FacesMessage message = new FacesMessage("Succesful", file.getFileName() + " is uploaded.");                 FacesContext.getCurrentInstance().addMessage(null, message);                 String filename = FilenameUtils.getName(file.getFileName());                 InputStream input = file.getInputstream();                 OutputStream output = new FileOutputStream(new File( filename));                 try {                     IOUtils.copy(input, output);                 } finally {                     IOUtils.closeQuietly(input);                     IOUtils.closeQuietly(output);                 }                 }catch(Exception e)                 {                  }             }         } 

I would appreciated if someone could help me finding the problem.

Thanks in advance

[EDIT]: I have tried to make a clean Spring project and tried all of the possibilities to make a <p:fileUpload>, but none of them work. But I looked on the traffic of my browser, and I found out something interesting: Traffic after I uploaded the File with advanced. The POST statement appears immediately after I pressed the uploadbutton, the other GETs appear 1-2 seconds after.

1 Answers

Answers 1

The documentation says

Advanced File Upload

FileUploadListener is the way to access the uploaded files in this mode, when a file is uploaded defined fileUploadListener is processed with a FileUploadEvent as the parameter.

Add the fileUploadListener with a FileUploadEvent parameter. Make the button AJAXical. Lose the enctype. Don't bother with fileUpload's value.

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment