Как обнаружить событие завершения загрузки файла в JSF2.0 с помощью Ajax - PullRequest
1 голос
/ 01 ноября 2011

Надеюсь, у вас все будет хорошо. На самом деле я хочу загрузить файлы изображений из системы в базу данных. Но я хочу, чтобы, когда пользователь загружал файлы, файл не отправлялся в базу данных напрямую, а после выбора файлов. Файлы могут сохраняться в какое-то временное местоположение, поэтому, когда пользователь нажимает кнопку «Сохранить», я перемещаю все изображения в базу данных. Я использую 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 голосов
/ 01 ноября 2011

поэтому, когда пользователь нажимает кнопку сохранения, я перемещаю все изображения в базу данных

Тогда просто реализуй это соответственно?

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

с

public void save() {
    // Move all images to database.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...