2013-05-17 21 views
0

我想上传与fileuploader但它返回null primefaces文件,primefaces FileUploadEvent返回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> 

我支持bean:我要上传的文件中使用一个将文件写入文件系统的outputStream。

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

这里是例外

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) 

回答

1

这里供大家参考。

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中 - 确保配置

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

好的,谢谢@CycDemo – joice

+0

你有一个很大的吻我,它搜索4小时后工作+1 –

0

尝试下面的代码:

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() { 
} 
} 

其中ent是实体类的对象,img(setImg)是BLOB类型的数据库列。您只需在您的项目下的xHTML文件所在的web文件夹下创建“temp-images”文件夹。告诉我你是否仍然有任何问题。

+0

好非常感谢,我会尝试这个代码 – joice

+0

我已经试过了你的代码,它的工作非常感谢@Jitesh。 – joice

+0

我有另一个问题,当我用fileUpload在同一个表单中添加两个输入文本字段,它不再保存图像在数据库中,我没有显示错误或异常。请问我该如何解决这个问题? – joice