0

I'm trying to upload a file with primefaces fileuploader but it returns null,

addPhotos.xhtml :

<h:form id="importDevicesForm" enctype="multipart/form-data">
                <h:outputText  value="Photo :" />
                <p:fileUpload id="scriptUpload" 
                    widgetVar="importDevicesWidget" 
                    fileUploadListener="#{docBean.file}"
                    auto="true"
                    label="Choisir une photo.."
                    mode="advanced"
                   allowTypes="/(\.|\/)(gif|jpe?g|png)$/">
            <h:outputText  value="Description :" />
            <p:commandButton value="Ajouter" action="#{docBean.ajouter_photo}"/>
         </h:form>

My backing bean : I want to upload the file an use an outputStream to write the file in filesystem.

@ManagedBean(name = "docBean")
@SessionScoped
public class DocumentBean implements Serializable {

private static final long serialVersionUID = 1L;
private UploadedFile file = null;
private File doc;     
private InfoDAO docdao = new InfoDaoImpl();

public UploadedFile getFile() {
return file;
  }
 public void setFile(FileUploadEvent event) {

this.file = event.getFile();
  }
  public String ajouter_photo() throws SQLException, IOException 

{
System.out.println("call");

 File targetFolder = new File("C:/images/upload");
    InputStream inputStream = this.file.getInputstream();
   OutputStream out = new FileOutputStream(new File(targetFolder,
        this.file.getFileName()));
   int read = 0;
    byte[] bytes = new byte[1024];

   while ((read = inputStream.read(bytes)) != -1) {
    out.write(bytes, 0, read);
   }
   inputStream.close();
   out.flush();
   out.close();
   Document f = new Document();
   f.setDescription(targetFolder.getPath());
    docdao.Ajouter_info(f);
    }

here is the exception

Avertissement: #{docBean.ajouter_photo}: java.lang.NullPointerException
 javax.faces.FacesException: #{docBean.ajouter_photo}: java.lang.NullPointerException
 at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:117)
Aritz
  • 30,971
  • 16
  • 136
  • 217
joice
  • 53
  • 4
  • 11

2 Answers2

1

Here, it is for your reference.

upload.xhtml

    <h:form enctype="multipart/form-data">
        <p:fileUpload value="#{PrimefacesFileUpload.uploadedFile}" mode="simple" sizeLimit="50000"
                      allowTypes="/(\\\\\\\\./\\\\\\\\/)(gif|jpe?g|png|txt)$/"/>
        <p:growl id="messages" showDetail="true"/>
        <p:commandButton value="Submit" actionListener="#{PrimefacesFileUpload.upload}" ajax="false"/>
    </h:form>

PrimefacesFileUpload.java

@ManagedBean(name = "PrimefacesFileUpload")
public class PrimefacesFileUpload {
    private UploadedFile uploadedFile;

    public void setUploadedFile(UploadedFile uploadedFile) {
        this.uploadedFile = uploadedFile;
    }

    public UploadedFile getUploadedFile() {
        return uploadedFile;
    }

    public void upload(ActionEvent event) {        
        String fileName = uploadedFile.getFileName();
        byte[] content = uploadedFile.getContents();
        String contentType = uploadedFile.getContentType();
        // Keep upload file 
        FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage("Successful! " + uploadedFile.getFileName() + " is uploaded."));
    }   
}

web.xml - Make sure to config

<filter>
  <filter-name>PrimeFaces FileUpload Filter</filter-name>
  <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
  <init-param>
      <param-name>thresholdSize</param-name>
      <param-value>51200</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>PrimeFaces FileUpload Filter</filter-name>
  <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
Zaw Than oo
  • 9,651
  • 13
  • 83
  • 131
0

Try following code:

xhtml:

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

        <p:fileUpload 
            id="scriptUpload" 
            widgetVar="importDevicesWidget" 
            fileUploadListener="#{imageUpload_2.handleFileUpload}"  
            value="#{imageUpload_2.uploaded_image}"
            auto="true"
            label="Choisir une photo.."
            mode="advanced"  
            allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
            />  
        <p:commandButton id="btn_save"
                         value="Save To Database"                             
                         actionListener="#{imageUpload_2.btn_save_clicked}"/>
    </h:form>

jsf:

@ManagedBean
@ViewScoped
public class ImageUpload_2 implements Serializable {

UploadedFile uploaded_image;

public UploadedFile getUploaded_image() {
    return uploaded_image;
}

public void setUploaded_image(UploadedFile uploaded_image) {
    this.uploaded_image = uploaded_image;
}
String upload_location;

public String getUpload_location() {
    return upload_location;
}

public void setUpload_location(String upload_location) {
    this.upload_location = upload_location;
}

public void handleFileUpload(FileUploadEvent event) {
    uploaded_image = event.getFile();
    ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
    String v_file_ext = uploaded_image.getFileName().split("\\.")[(uploaded_image.getFileName().split("\\.").length) - 1];
    upload_location = servletContext.getRealPath("") + File.separator + "temp-images" + File.separator + "3" + "." + v_file_ext;
    FileImageOutputStream imageOutput;
    try {
        imageOutput = new FileImageOutputStream(new File(upload_location));
        imageOutput.write(uploaded_image.getContents(), 0, uploaded_image.getContents().length);
        imageOutput.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

public void btn_save_clicked(ActionEvent event) {

    byte[] file = new byte[uploaded_image.getContents().length];
    System.arraycopy(uploaded_image.getContents(), 0, file, 0, uploaded_image.getContents().length);
    //ent.setImg(file);
    //yourfacade.create(ent);
}

public ImageUpload_2() {
}
}

Where ent is the object of Entity Class and img (setImg) is database column of BLOB type.You just need to create "temp-images" folder in you project under web folder where xhtml files are lying. Tell me if you are still having any issue.

Jitesh
  • 1,384
  • 10
  • 20
  • I have another problem when I added two inputtext field in the same form with the fileUpload it doesn't save image in database anymore and I have no error or exception displayed. please how can I resolve this? – joice May 21 '13 at 20:43