如何使用Ajax在JSF2.0中检测文件上传完成事件

时间:2011-11-01 06:04:30

标签: jsf-2

希望你们一切顺利。其实我想将图像文件从系统上传到数据库。但是我希望当用户上传文件时文件没有直接进入数据库但是在选择文件后.Files可以保存到某个临时位置,所以当用户点击保存按钮然后我将所有图像移动到数据库。我正在使用JSF 2.0和PrimeFaces。我在某个博客上找到了代码。代码的作用是在上传文件后将其转换为byte []数组。我将该字节数组保存在列表中,因此在保存按钮上我从列表中获取图像。

这是代码

private StreamedContent image;

public StreamedContent getImage() {
    return image;
}

public void setImage(StreamedContent image) {
    this.image = image;
}

public String imageUpload(FileUploadEvent event) {

    try {

        // Convert file from input stream to bytes
        byte[] byteArray = InputStreamToByte(event.getFile().getInputstream());

        /**
         * Add images to list so we can retrieve them when user click on save button
         */
        boolean add = images.add(new Images(byteArray));


        /**
         * Class.forName("org.postgresql.Driver");
           String url = "jdbc:postgresql://x.x.x.x:5432/MYDB";
           Connection oConnection = DriverManager.getConnection(url, "username", "password");
           System.out.println("Sucessfully connected to Postgres Database");
         *
         * byte[] bytes = bos.toByteArray();
           String sql = "INSERT INTO my_table (byte_array) VALUES (?)";
           statement = oConnection.prepareStatement(sql);
           statement.setBytes(1, bytes);
           statement.executeUpdate();
           System.out.println("Image inserted into database!");
         */

        //byteArray used to store picture into database
        InputStream ist = new ByteArrayInputStream(byteArray);

        /*
         * StreamedContent Object used to show the picture in jsf pages. We need to convert
         * again bytearray to InputStream
         */
        image = new DefaultStreamedContent(ist, "image/jpg");

        FacesMessage msg = new FacesMessage("Succesful picture is uploaded.");
        FacesContext.getCurrentInstance().addMessage(null, msg);

        //we dont need to use faces-config to navigate in jsf 2
        return null ;

     } catch (Exception e) {

         FacesMessage msg = new FacesMessage("Exception happen");
         FacesContext.getCurrentInstance().addMessage(null, msg);

         e.printStackTrace();

         return null;

     }

} //end of imageUpload()

这是我的.html文件

<h:panelGrid width="30%" columns="3">

    <h:outputText value="Map to upload" />
    <p:fileUpload id="uploadFile"
                  description="Image"
                  update="messages"
                  allowTypes="*.jpg;*.png;*.gif;*.jpeg;"
                  auto="true"
                  fileUploadListener=#{cityDetail.imageUpload} >

        <f:ajax event="????" execute="???" render="uploadedInage" />

    </p:fileUpload>

    <p:graphicImage id="uploadedImage"
                    value="#{cityDetail.image}"


</h:panelGrid>

现在我希望在完全上传图像时,图像也会显示在面板网格第3列中。为此,我试图使用Ajax。但我不知道我应该使用什么事件。所以请任何人告诉我事件名称,我也想要执行我应该使用“@this”? 。也告诉我,我的方法是正确的,以便在列表中保存二进制图像,以便当用户点击保存按钮然后我检索所有图像并将它们发送到数据库。为了我的目的,在这里使用Ajax也是正确的想法吗?

由于

1 个答案:

答案 0 :(得分:0)

  

所以当用户点击“保存”按钮,然后我将所有图像移动到数据库

那么只需相应地实现它?

<p:commandButton value="save" action="#{cityDetail.save}" />

public void save() {
    // Move all images to database.
}