2013-08-05 25 views
7

Sto cercando di funzionare come quello che è documentato nella guida utente di primefaces e in alcuni post che sono stati creati lì.<p: fileUpload> dammi sempre il contenuto nullo

Upload file in JSF primefaces.

l'environnement è: JavaEE pieni + JPA + JSF 2.2 + primefaces 4 + GlassFish v4

I m distacco di nuovo, perché ho provato ogni campione e suggerimento che ho trovato sul web, senza successo.

I m in grado, per ottenere il nome del file caricato con: event.getFile.getFileName, ma il contenuto è sempre nullo

Aggiornamenti ------------- ---- ------------------------

la mia pagina xhtml:

<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> 

mia bean gestito:

@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()); 
    } 

il mio 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> 

sicuro che ho sul mio 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> 

quando mi sto triyng caricare ho ottenuto sul registro di output GlassFish:

INFO: mdmx.jpg 
INFO: le fichier null 

qualche idea in proposito ??

+0

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

+0

ho provato cosa suggerisci, ma nessun successo. Nello strumento di debug di Chrome ho ottenuto i parametri http e sembra essere corretto, il tipo di contenuto è un "multipart/form-data". non riesco a trovare la causa dei problemi !! –

+0

Ho controllato l'origine delle primefaces. Sembra che il tuo 'File' sia effettivamente 'null' che causa l'NPE. Se hai impostato correttamente le autorizzazioni (chmod e user/group rights) per '/ opt/upld', allora è difficile indovinare. – Manuel

risposta

0

Includere Apache Commons IO e Caricamento file API per la vostra applicazione:

+0

alredy do. ho sul mio apache commons-io e commons fileupload della mia maven dependance (l'ultimo è richiesto automaticamente con primefaces 3.5) –

15

ho risolto questo problema come folowing:

Il caricamento ha funzionato per me quando si utilizza: IOUtils.toByteArray (file.getInputstream());

l'environnement è: Java EE 7 (JPA, EJB, JSF 2.2.4), Glassfish V4, primefaces 4

do qui l'esempio completo, per il riutilizzo.

Primo: upload.xhtml

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

Secondo: PersonController.java (JSF bean gestito): pacchetto 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 
} 

} 

Terzo: il 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> 
    <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> 

se si dispone di un entity bean "persona", ad esempio con un attributo binario @Lob, è possibile riempire con i dati di byte. per salvare l'immagine (o file se necessario).

per ripristinare su un

il 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> 

e il metodo PersonController per ripristinare l'immagine (Questo codice è di BalusC da StackOverflow)

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

grazie per tutti mi hanno aiutato

grazie ancora

+0

Il team Primefaces dovrebbe aggiornare la propria documentazione per includere IOUtils.toByteArray (file.getInputstream()) nella sezione p: fileupload. Funziona alla grande!! Grazie! –

+1

Ho riscontrato lo stesso problema durante l'aggiornamento della versione jsf dalla 2.1.x alla 2.2.0. ('Event.getFile(). GetContents()' genera 'NullpointerException') grazie You @Mohamed abdelbassat – Arunprasad