2013-08-05 12 views
7

Ich versuche, so zu arbeiten, wie es im Benutzerhandbuch von primefaces dokumentiert ist, und einige Beiträge, die dort erstellt wurden.<p: fileUpload> gib mir immer null Inhalt

Upload file in JSF primefaces.

die environnement ist: JavaEE voll + JPA + JSF 2.2 + primefaces 4 + Glasfischen v4

Ich bin wieder zu veröffentlichen, weil ich jede Probe und Vorschlag versucht haben, die ich im Internet, ohne Erfolg gefunden zu haben.

Ich bin in der Lage, die Datei mit hochgeladenen Namen zu bekommen: event.getFile.getFileName, aber der Inhalt ist immer null

------------- Updates ---- ------------------------

Meine xhtml Seite:

<h:form enctype="multipart/form-data"> 

       <p:outputLabel value="La photo :"/> 
       <p:fileUpload fileUploadListener="#{personController.upload}" 
     mode="advanced" 
     update="messages" 
     sizeLimit="100000" 
     allowTypes="/(\.|\/)(gif|jpe?g|png)$/"/> 
       <p:growl id="messages" showDetail="true"/> 

      </h:form> 

meine Managed Bean:

@Named(value = "personController") 
@SessionScoped 
public class PersonController implements Serializable { 

    /** 
    * Creates a new instance of PersonController 
    */ 
    @Inject 
    private PersonneFacade personneService; 
    private Personne current; 
    private Personne newPerson; 
    private List<Personne> personnes; 


    public PersonController() { 
    } 

    public List<Personne> getAll(){ 
     return personneService.findAll(); 
    } 


    public void upload(FileUploadEvent event) { 
     FacesMessage msg = new FacesMessage("Success! ", event.getFile().getFileName() + " is uploaded."); 
     FacesContext.getCurrentInstance().addMessage(null, msg); 
     // Do what you want with the file 

     System.out.println(event.getFile().getFileName()); 
     System.out.println("le fichier " + event.getFile().getContents()); 
     newPerson.setPhoto(event.getFile().getContents()); 
    } 

meine web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> 
    <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>*.xhtml</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>index.xhtml</welcome-file> 
    </welcome-file-list> 

    <!-- ############################################# --> 
<!-- # File upload          # --> 
<!-- ############################################# --> 
<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> 


</web-app> 

sicher, ich habe auf meinem pom.xml:

<dependencies> 
     <dependency> 
    <groupId>org.primefaces</groupId> 
    <artifactId>primefaces</artifactId> 
    <version>4.0</version> 
</dependency> 
     <dependency> 
      <groupId>commons-fileupload</groupId> 
      <artifactId>commons-fileupload</artifactId> 
      <version>1.3</version> 
     </dependency> 
     <dependency> 
      <groupId>commons-io</groupId> 
      <artifactId>commons-io</artifactId> 
      <version>2.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.eclipse.persistence</groupId> 
      <artifactId>eclipselink</artifactId> 
      <version>2.5.0-SNAPSHOT</version> 
      <scope>provided</scope> 
     </dependency> 

wenn i i m triyng zum Hochladen auf dem Glasfischen Ausgabeprotokoll bekam:

INFO: mdmx.jpg 
INFO: le fichier null 

eine Idee über ??

+0

Verwandte: http://stackoverflow.com/questions/8875818/how-to-use-primefaces-pfileupload-listener-method-is-never-invoked/8880083#8880083 – BalusC

+0

Ich habe versucht, was Sie vorschlagen, aber kein Erfolg. Auf dem Chrome-Debug-Tool habe ich die HTTP-Parameter und es scheint richtig zu sein, der Inhaltstyp ist ein "Multipart/Form-Daten". Ich kann die Probleme nicht finden !! –

+0

Ich habe die Quellquellen überprüft. Es sieht so aus, als ob deine 'Datei' eigentlich 'null' ist, was die NPE verursacht. Wenn Sie die richtigen Berechtigungseinstellungen (chmod & user/group rights) für '/ opt/upld' haben, ist es schwer zu erraten. – Manuel

Antwort

0

Fügen Sie Apache-Commons IO und Dateiupload APIs für Ihre App:

+0

alredy tun. Ich habe auf meiner Maven-Abhängigkeit Apache commons-io und commons fileupload (die letzte wird automatisch mit nativen 3.5 benötigt) –

15

ich dieses Problem gelöst haben wie Folowing:

Der Upload funktionierte für mich bei Verwendung von: IOUtils.toByteArray (file.getInputstream());

die environnement ist: Java EE 7 (JPA, EJB, JSF 2.2.4), Glassfish V4, Primefaces 4

ich gebe hier das komplette Beispiel für die Wiederverwendung.

Erstens: upload.xhtml

<h:form enctype="multipart/form-data"> 
    <p:fileUpload fileUploadListener="#{personController.handleFileUpload}" /> 
      <p:growl id="messages" showDetail="true"/> 
</h:form> 

Zweitens: PersonController.java (JSF Managed Bean): Paket com.sos.fso.grh.controllers;

import com.sos.fso.grh.entities.Person; 
import com.sos.fso.grh.services.PersonFacade; 
import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.Serializable; 
import java.util.List; 
import javax.enterprise.context.SessionScoped; 
import javax.faces.application.FacesMessage; 
import javax.faces.context.FacesContext; 
import javax.inject.Inject; 
import javax.inject.Named; 
import org.apache.commons.io.IOUtils; 
import org.primefaces.event.FileUploadEvent; 
import org.primefaces.model.DefaultStreamedContent; 
import org.primefaces.model.UploadedFile; 

@Named 
@SessionScoped 
public class PersonController implements Serializable{ 

@Inject 
private PersonFacade personService; 

private Person current; 
private Person newPerson; 
private List<Person> personnes; 

public void handleFileUpload(FileUploadEvent event) throws IOException { 

    UploadedFile file = event.getFile(); 
    System.out.println(file.getFileName()); 

    byte[] foto = IOUtils.toByteArray(file.getInputstream()); 
    System.out.println(foto); 
    newPerson.setPhoto(foto); 
//application code 
} 

} 

Drittens: die Bahn.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
    </context-param> 
    <context-param> 
     <param-name>primefaces.THEME</param-name> 
     <param-value>bootstrap</param-value> 
    </context-param> 
     <context-param> 
<param-name>primefaces.UPLOADER</param-name> 
<param-value>auto</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>*.xhtml</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>index.xhtml</welcome-file> 
    </welcome-file-list> 
     </web-app> 

, wenn Sie einen Entity-Bean „Person“ zum Beispiel haben mit einem @Lob Binärattribut, können Sie es mit den Byte-Daten füllen. um das Bild zu speichern (oder die Datei, wenn Sie es brauchen).

es auf einem

die view.xhtml

<!DOCTYPE html> 
<html xmlns="http://www.w3c.org/1999/xhtml" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:p="http://primefaces.org/ui"> 
<h:head> 
</h:head> 
<h:body> 
    <h:form> 
    #{personController.current.FName} 

     <p:panelGrid columns="2"> 
     <p:outputLabel value="Nom :"/> 
     <h:outputText value="#{personController.current.FName}" /> 

     <p:outputLabel value="Prénom :"/> 
     <h:outputText value="#{personController.current.LName}" /> 

     <p:outputLabel value="Date de naissance :"/> 
     <h:outputText value="#{personController.current.birthDate}" /> 

     <p:outputLabel value="photo :"/> 
     <p:graphicImage value="#{personController.byteToImage(personController.current.photo)}" /> 
     </p:panelGrid> 
     <p:commandLink value="retour a la liste" action="#{personController.showList}"/> 
     </h:form> 

</h:body> 
</html> 

und die PersonController Methode

wiederherzustellen das Bild wieder (Dieser Code ist von BalusC von Stackoverflow)

public DefaultStreamedContent byteToImage(byte[] imgBytes) throws IOException { 
ByteArrayInputStream img = new ByteArrayInputStream(imgBytes); 
return new DefaultStreamedContent(img,"image/jpg"); 
} 

Dank für Jeder hat mir geholfen.

Dank wieder

+0

Primefaces-Team sollte ihre Dokumentation zu IOUtils.toByteArray (file.getInputstream()) zu aktualisieren, um den Abschnitt p: fileupload. Funktioniert super!! Vielen Dank! –

+1

Ich habe dasselbe Problem während der Aktualisierung der JSF-Version von 2.1.x auf 2.2.0 ('event.getFile(). GetContents()' wirft 'NullpointerException') Danke, @Mohamed abdelbassat – Arunprasad

Verwandte Themen