Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Curso JEE salvando imagens

Bom dia gente, no curso de JEE da criação da loja da casa do código, nos aprendemos a salvar as imagens na pasta c:\casadocodigo\livros.

Porém, ao salvar a imagem, o meu projeto está tentando salvar dentro da pasta do servidor, e não em c:\casadocodigo\livros, como não existe a pasta lá, ele da o famoso FileNotFoundException, estou usando o servidor Glassfish, alguém saberia me dizer o que pode estar acontecendo?

6 respostas

Oi Felipe

Pode postar o seu código ?

abraço

Então, o código é o projeto do curso, eu não mudei nada, eu apenas coloquei para rodar no glassfish e no curso ele ta usando o wildfly.

Oi Felipe

É melhor você enviar o código mesmo, as vezes escapa alguma coisa que você não percebeu.

abraço

Pois bem, tudo começa pelo formulário:

    <h:form enctype="multipart/form-data">
            <div class="form-group">
                <h:outputLabel value="Título" for="titulo" />
                <h:inputText value="#{adminLivrosBean.livro.titulo}" required="true"
                    id="titulo" styleClass="form-control" />
                <h:message for="titulo" />
            </div>
            <div class="form-group">
                <h:outputLabel value="Descrição" for="descricao" />
                <h:inputTextarea rows="4" cols="20" required="true"
                    value="#{adminLivrosBean.livro.descricao}" id="descricao"
                    styleClass="form-control" />
                <h:message for="descricao" />
            </div>
            <div class="form-group">
                <h:outputLabel value="Número de Páginas" for="numeroPaginas" />
                <h:inputText value="#{adminLivrosBean.livro.numeroPaginas}"
                    required="true" id="numeroPaginas" styleClass="form-control" />
                <h:message for="numeroPaginas" />
            </div>
            <div class="form-group">
                <h:outputLabel value="Preço" for="preco" />
                <h:inputText value="#{adminLivrosBean.livro.preco}" required="true"
                    id="preco" styleClass="form-control" />
                <h:message for="preco" />
            </div>
            <div class="form-group">
                <h:outputLabel value="Autores" for="autores" />
                <h:selectManyListbox value="#{adminLivrosBean.livro.autores}"
                    converter="autorConverter" id="autores" styleClass="form-control">
                    <f:selectItems value="#{adminLivrosBean.autores}" var="autor"
                        itemValue="#{autor}" itemLabel="#{autor.nome}" />
                </h:selectManyListbox>
                <h:message for="autores" />
            </div>
            <div class="form-group">
                <h:outputLabel value="Data de Publicação" />
                <h:inputText value="#{adminLivrosBean.livro.dataPublicacao}"
                    id="dataPublicacao" styleClass="form-control" />
                <h:message for="dataPublicacao" />
            </div>
            <div class="form-group">
                <h:outputLabel value="Capa do Livro" />
                <h:inputFile value="#{adminLivrosBean.capaLivro}" id="capaLivro"
                    styleClass="form-control" />
            </div>
            <h:commandButton value="Cadastrar" action="#{adminLivrosBean.salvar}"
                styleClass="btn btn-primary" />
        </h:form>

O bean responsável pelo recebimento das informações para a persistência do livro:

@Named
@RequestScoped
public class AdminLivrosBean {

    private Livro livro = new Livro();

    @Inject
    private LivroDao dao;
    @Inject
    private AutorDao autorDao;
    @Inject
    private FacesContext context; 

    private Part capaLivro;

    @Transactional
    public String salvar() {
        FileSaver fileSaver = new FileSaver();
        String capaPath = fileSaver.write(capaLivro, "livros");
        livro.setCapaPath(capaPath);
        dao.salvar(livro);

        context.getExternalContext()
            .getFlash().setKeepMessages(true);
        context
            .addMessage(null, new FacesMessage("Livro cadastrado com sucesso!"));

        return "/livros/lista?faces-redirect=true";
    }

    public List<Autor> getAutores() {
        return autorDao.listar();
    }

    public Livro getLivro() {
        return livro;
    }

    public void setLivro(Livro livro) {
        this.livro = livro;
    }

    public Part getCapaLivro() {
        return capaLivro;
    }

    public void setCapaLivro(Part capaLivro) {
        this.capaLivro = capaLivro;
    }

}

A classe para salvar a foto quando recebo no form:

public class FileSaver {

    public static final String SERVER_PATH = "/casadocodigo";

    public String write(Part arquivo, String path) {
        String relativePath = path + "/" + arquivo.getSubmittedFileName();
        String fullPath = SERVER_PATH + "/" + relativePath;
        try {
            arquivo.write(fullPath);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        return relativePath;
    }

    public static void transfer(Path source, OutputStream outputStream) {
        try {
            FileInputStream input = new FileInputStream(source.toFile());
            try( ReadableByteChannel inputChannel = Channels.newChannel(input);
                    WritableByteChannel outputChannel = Channels.newChannel(outputStream)) {
                ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 10);

                while(inputChannel.read(buffer) != -1) {
                    buffer.flip();
                    outputChannel.write(buffer);
                    buffer.clear();
                }
            } catch (IOException e) {
                throw new RuntimeException(e); 
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e); 
        }
    }
}

Durante o curso, é pedido para criar uma pasta "C:\casadocodigo\livros", é lá que será salvo as imagens vindas do formulário, e também onde o método que lista os livros vai buscar as imagens de cada livro.

Porém, ao tentar cadastrar um livro, ele tenta salvar no seguinte diretório: C:\Dev\Server\glassfish4\glassfish\domains\domain1\generated\jsp\casadocodigo\casadocodigo\livros

Como o diretório não existe, ele da erro.

Fellipe, vc conseguiu resolver esse erro ? Como vc fez ? Estou tendo esse mesmo problema tb

solução
SERVER_PATH = "/casadocodigo";
     String fullPath = SERVER_PATH + "/" + relativePath;

ele vai criar na raiz mesmo já que vc não especificou um caminho que exista em seu servidor, tem que especificar um caminho completo que exista

SERVER_PATH = "/home/usuario/documentos/";