6
respostas

Botão upload e gravar

Boa tarde,

Pessoal estou com um problema de logica, não sei se é possível fazer o que eu quero com o JSF mas vou explicar.

Tenho um cadastro de livros que no final existe o botão do upload do arquivo, qual seria a ideia, que o livro seja gravado apenas quando eu clicar no botão gravar, quero fazer isso sem perder as funcionalidades que tenho no botão gravar.

Codigo do botão gravar e upload

<!--Realizar upload -->
        <h:form enctype="multipart/form-data">
                    <p:fileUpload mode="advanced" 
                        fileUploadListener="}"
                        allowTypes="/(\.|\/)(gif|jpg|jpeg|gif|png|PNG|GIF|JPG|JPEG)$/"
                        auto="false" />
                </h:form>
<!--Gravar livro -->
            <p:commandButton value="Gravar" action="#{livroBean.gravar}"
                process="@form" update="@form :formTabelaLivros:tabelaLivros"
                ajax="false" />

Metodo Gravar do Livro

public void gravar() {
        System.out.println("Gravando livro " + this.livro.getTitulo());

        // O metodo abaixo verifica se o livro possui um autor, caso não possua ele não
        // permite a gravação
        if (livro.getAutores().isEmpty()) {
            FacesContext.getCurrentInstance().addMessage("autor",
                    new FacesMessage("Livro deve ter pelo menos um Autor."));
            return;
        }
        DAO<Livro> dao = new DAO<Livro>(Livro.class);

        // Ao clicar no metodo gravar está condição é ativada, caso o livro já exista
        // ele é atualizado, caso contrario ele é atualizadoasd
        if (this.livro.getId() == null) {
            dao.adiciona(this.livro);
            this.livros = dao.listaTodos();
        } else {
            dao.atualiza(this.livro);
        }

        this.livro = new Livro();
    }

Metodo de realizar upload bean

public void upload() {
        try {
            File file = new File(diretorioRaiz(), uploadedFile.getFileName());

            DAO<Arquivo> dao = new DAO<Arquivo>(Arquivo.class);
            arquivo.setNomeArquivo(uploadedFile.getFileName());
            arquivo.setCaminhoArquivo(diretorioRaiz());
            arquivo.setTamanhoArquivo(uploadedFile.getSize());

            dao.adiciona(arquivo);


            OutputStream out = new FileOutputStream(file);
            out.write(uploadedFile.getContents());
            out.close();

            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage("Upload completo", "O arquivo " + uploadedFile.getFileName() + " foi salvo!"));
        } catch (IOException e) {
            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro", e.getMessage()));
        }

    }

Tenho um relacionamento 1 para um entre o DB livro e o DB arquivo, gostaria que o arquivo fosse gravado apenas quando o livro estiver ok, ou os dois fossem gravados ao mesmo tempo.

Fico grato com a resposta de todos.

6 respostas

fala Clinton, tudo bem?

não sei entendi a dúvida direito, mas não seria apenas chamar o método upload depois que gravar no banco de dados no seu método grava?

Oi Samir blz ?

Não pois depois que eu gravo ele vai para o banco, já o botão de upload tem como deixar automático que já vai direto para a gravação e deixar que o proprio usuario clique em upload, como eu tenho algumas validações no meu primefaces tenho medo que o usuario realize o upload do arquivo e no meio do processo desista de gravar o livro, desta forma ficarei com varios arquivos duplicados no servidor, a ideia e gravar os dois juntos ou na hora de clicar em gravar ele realize o upload junto.

Boa, entendi.

Vê se essa solução faz sentido: Faz o seu managedBean ser ViewScoped, ele vai durar por todo o tempo que vc estiver naquela view. na hora de fazer o upload, no lugar de colocar ele no banco, salva dentro de um atributo de Livro. E no final na hora de gravar o Livro, grava o arquivo tb

Entendi, vou tentar está logica, mas no caso quem deveria ser um ViewScoped ?

O uploadBean ou o livroBean, a função do upload está na classe uploadBean de resto está no livroBean.

Eles deveriam estar no mesmo Bean, provavelmente LivroBean que é o lado forte do relacionamento.

Vou fazer as alterações e volto aqui para informar o ocorrido.