2013-08-05 15 views
7

Próbuję działać tak, jak jest to udokumentowane w przewodniku użytkownika, a także w niektórych jego założeniach.<p: fileUpload> zawsze daje mi zerową zawartość

Upload file in JSF primefaces.

Environnement jest: JavaEE pełne + JPA + JSF 2.2 + primefaces 4 + GlassFish v4

ja jestem delegowania ponownie, ponieważ próbowałem każdą próbkę i sugestii znalazłem w internecie, bez powodzenia.

ja jestem w stanie, aby pobrać plik przesłany nazwę z: event.getFile.getFileName, ale treść jest zawsze zerowy

------------- Aktualizacje ---- ------------------------

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

moja udało fasola:

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

mój 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> 

pewien, że mam w moim 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> 

kiedy I m triyng przesłać mam na GlassFish dzienniku wyjścia:

INFO: mdmx.jpg 
INFO: le fichier null 

jakiś pomysł o ??

+0

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

+0

próbowałem co sugerujesz, ale bez powodzenia. W chromowanym narzędziu do debugowania mam parametry http i wydaje się, że jest poprawny, typem treści jest "wieloczęściowy/formularz-dane". nie mogę znaleźć przyczyny problemów !! –

+0

Sprawdziłem źródło primefaces. Wygląda na to, że twój "Plik" jest w rzeczywistości 'null', co powoduje NPE. Jeśli posiadasz poprawne ustawienia uprawnień (chmod i user/group rights) dla '/ opt/upld', to trudno zgadnąć. – Manuel

Odpowiedz

0

Dołącz Apache Commons IO i FileUpload API do aplikacji:

+0

alredy do. Mam na moim komputerze zależność apache commons-io i commons fileupload (ostatni jest automatycznie wymagany z primefaces 3.5) –

15

Mam rozwiązać ten problem jak folowing:

Przesyłanie działało dla mnie podczas używania: IOUtils.toByteArray (file.getInputstream());

Environnement jest: JAVA EE 7 (JPA, EJB JSF 2.2.4) GlassFish V4 Primefaces 4

daję tutaj pełny przykład, w przypadku ponownego wykorzystania.

pierwsze: upload.xhtml

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

drugie: PersonController.java (JSF udało fasola): com.sos.fso.grh.controllers opakowaniu;

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 
} 

} 

Po trzecie: sieć.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> 

jeśli masz fasoli podmiot „osoba” na przykład za pomocą atrybutu binarnego @Lob, można wypełnić go z danych bajtowych. aby zapisać obraz (lub plik, jeśli potrzebujesz).

przywrócić go na

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

i metoda PersonController aby przywrócić obraz (Ten kod jest BalusC z stackoverflow)

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

dzięki za wszyscy mi pomogli.

dzięki jeszcze raz

+0

Zespół Primefaces powinien zaktualizować swoją dokumentację, aby dołączyć IOUtils.toByteArray (file.getInputstream()) do sekcji p: fileupload. Działa świetnie!! Dziękuję Ci! –

+1

Mam do czynienia z tym samym problemem podczas uaktualniania wersji jsf z 2.1.x do 2.2.0. ("Event.getFile(). GetContents()" wyrzuca "NullpointerException") dzięki You @Mohamed abdelbassat – Arunprasad

Powiązane problemy