2013-08-05 5 views
7

मैं प्राइमफ़ेस उपयोगकर्ता मार्गदर्शिका में दस्तावेज़ों की तरह काम करने की कोशिश कर रहा हूं, और वहां स्थापित कुछ पोस्ट हैं।<p: fileUpload> हमेशा मुझे शून्य सामग्री दें

Upload file in JSF primefaces

environnement है: javaee पूर्ण + जेपीए + JSF 2.2 + primefaces 4 + glassfish v4

मैं फिर से पोस्टिंग, क्योंकि मैं, हर नमूना और सुझाव मैं वेब पर पाया है की कोशिश की है सफलता के बिना हूँ।

मैं सक्षम हूँ, के साथ अपलोड नाम फ़ाइल प्राप्त करने के लिए: event.getFile.getFileName, लेकिन सामग्री हमेशा अशक्त

------------- अपडेट है ---- ------------------------

मेरे एक्सएचटीएमएल पेज:

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

अपने प्रबंधित सेम:

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

मेरा 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> 

यकीन है कि मैं अपने 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> 

जब मैं अपलोड करने के लिए मैं glassfish उत्पादन लॉग पर मिला triyng हूँ:

INFO: mdmx.jpg 
INFO: le fichier null 

के बारे में किसी भी विचार ??

+0

संबंधित: http://stackoverflow.com/questions/8875818/how-to-use-primefaces-pfileupload-listener-method-is-never-invoked/8880083#8880083 – BalusC

+0

मैं कोशिश की है आप क्या सुझाव देते हैं, लेकिन कोई सफलता नहीं। क्रोम डीबग टूल पर मुझे http पैरामीटर मिलते हैं और यह सही लगता है, सामग्री प्रकार एक "मल्टीपार्ट/फॉर्म-डेटा" है। मुझे समस्याएं नहीं मिल रही हैं !! –

+0

मैंने प्राइमफ़ेस स्रोत की जांच की है। ऐसा लगता है कि आपकी 'फ़ाइल' वास्तव में 'शून्य' है जो एनपीई का कारण बनती है। यदि आपके पास '/ opt/upld' के लिए सही अनुमति सेटअप (chmod और उपयोगकर्ता/समूह अधिकार) हैं तो अनुमान लगाना मुश्किल है। – Manuel

उत्तर

0

अपाचे-कॉमन्स आईओ और FileUpload शामिल एपीआई को अपने ऐप्लिकेशन पर की:

+0

alredy do। मेरे पास मैवेन निर्भरता के अपाचे कॉमन्स-आईओ और कॉमन्स फ़ाइल अपलोड (अंतिम प्राइमफेस 3.5 के साथ स्वचालित रूप से आवश्यक है) –

15

मैं folowing की तरह इस मुद्दे को हल कर लिया है:

अपलोड करते समय मेरे लिए अपलोड किया गया: IOUtils.toByteArray (file.getInputstream());

environnement है: जावा ईई 7 (जेपीए, EJB, JSF 2.2.4), Glassfish V4, Primefaces 4

मैं यहाँ पुन: उपयोग के लिए पूर्ण उदाहरण दे,।

पहले: upload.xhtml

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

दूसरा: PersonController.java (JSF कामयाब सेम): पैकेज 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 
} 

} 

तीसरा: वेब।एक्सएमएल

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

यदि आप एक @Lob द्विआधारी विशेषता के साथ एक इकाई सेम "व्यक्ति" उदाहरण के लिए है, तो आप बाइट डेटा के साथ भर सकते हैं। छवि को सहेजने के लिए (या यदि आपको आवश्यकता हो तो फ़ाइल)।

छवि बहाल करने के लिए 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> 

और PersonController विधि एक

पर बहाल करने के लिए (यह कोड Stackoverflow से BalusC की है) के लिए

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

धन्यवाद हर किसी ने मेरी मदद की।

धन्यवाद फिर से

+0

प्राइमफेस टीम को अपने दस्तावेज़ों को IOUtils.toByteArray (file.getInputstream()) को पी: fileupload सेक्शन में शामिल करने के लिए अद्यतन करना चाहिए। बहुत अच्छा काम करता है!! धन्यवाद! –

+1

मुझे जेएसएफ संस्करण को 2.1.x से 2.2.0 तक अपग्रेड करते समय एक ही समस्या का सामना करना पड़ रहा है। ('Event.getFile()। GetContents()' फेंकता है 'NullpointerException') धन्यवाद आप @ मोहम्मद abdelbassat – Arunprasad

संबंधित मुद्दे