Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
15
respostas

FileSaver não funciona

Alguém me ajuda, por favor?? Quando preencho o form recebo status 400 no navegador e nenhum erro no console. O método do controller:

@RequestMapping(method=RequestMethod.POST)
    public ModelAndView novo(Produto produto, MultipartFile imagem){

        String path = fileSaver.save(imagem, "arquivo-produtos");
        produto.setImagemPath(path);
        dao.grava(produto);
        return new ModelAndView("redirect:/");
    }

O método save do FileSaver:

    public String save(MultipartFile file, String baseFolder) {
        try {

            String realPath = request.getServletContext().getRealPath("/" + baseFolder);
            String path = realPath + "/" + file.getOriginalFilename();
            System.out.println(path);
            file.transferTo(new File(path));

            return baseFolder + "/" + file.getOriginalFilename();

        } catch (IllegalStateException | IOException e) {
            throw new RuntimeException(e);
        }
    }

Já visitei outros posts e tentei tudo que foi sugerido, porém o erro continua.

15 respostas

Eu tive um problema com a criação da pasta "arquivo-produtos", Só deu certo quando eu criei essa pasta no seguinte local: src->main->webapp->arquivo-produtos, quando eu criava a pasta em outro lugar o maven não empacotava e dava um erro 404 no servidor e no log aparecia que a pasta não tinha sido criada.

Oi Rafael, tudo bom? minha pasta "arquivo-produto" está nesse diretório também, não sei o que pode estar errado pra dar esse erro

Lembrei de uma outra coisa, eu coloquei um arquivo texto vazio dentro da pasta e só depois disso ela foi criada no servidor, tente criar um arquivo texto vazio dentro da pasta e verifique no diretório da aplicação lá no tomcat se a pasta foi criada.

Oi Rafael, tentei isso agora e continuo recebendo erro 400 e a mensagem "The request sent by the client was syntactically incorrect" no navegador. O pior é que no console não aparece nada, não sei mais o que pode ser.

Ah, e a pasta está sendo criada em C:\Users\avana\Documents\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\loja\arquivo-produtos, inclusive o arquivo de texto que criei depois da tua sugestão está lá, mas nada do arquivo enviado na requisição. Já tentei mudar no Server Locations do tomcat marcando a opção "Use Tomcat installation (takes control of Tomcat installation)", mas quando faço isso o Tomcat dá erro e nem inicia.

Como está o seu JSP ? você colocou o enctype="multipart/form-data" ? Coloca o JSP aqui no post para eu dar uma olhada.

O problema é no jsp, pq coloquei sysout no Controller e no FileSaver, e nem no controller tá chegando, mas não vi qual é o problema. Já tirei até as validações mas não consigo ver o que está errado. Esse é o form:

" method="POST" enctype="multipart/form-data">

Nome:

Descrição:

Preço:

Categoria: Selecione ${categoria.nome}

Imagem:

        <form action="<c:url value="/produto" />" method="POST" enctype="multipart/form-data">

            <div>
                Nome: <input type="text" name="nome" placeholder="NOME">
            </div>

            <div>
                Descrição: <textarea rows="5" cols="20" name="descricao" placeholder="DESCRIÇÃO"></textarea>
            </div>

            <div>
                Preço: <input type="text" name="preco" placeholder="VALOR">
            </div>

            <div>
                Categoria:
                <select name="categoria">
                    <option>Selecione</option>
                    <c:forEach items="${categorias}" var="categoria">
                        <option value="${categoria}">${categoria.nome}</option>
                    </c:forEach>
                </select>
            </div>

            <div>
                Imagem: <input type="file" name="imagem">
            </div>

            <div>
                <input type="submit" value="Cadastrar">
            </div>
        </form>

Vamos atirar para todos os lados hehehehe, então um ponto que eu vi no seu JSP é no action o aspas duplas, no meu caso eu usei aspas simples:

O meu .JSP está mais avançado pois eu estou no final do curso, mas de qualquer maneira dá uma olhada ai

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@taglib uri="http://www.springframework.org/tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Venda de livros</title>
</head>
<body>
    <!-- 
        mvcUrl("controller#metodo").build() 

     -->
    <form:form action="${s:mvcUrl('PC#grava').build() }" method="post"
        commandName="produto" enctype="multipart/form-data">
        <div>
            <label>Titulo</label> 
            <form:input path="titulo" />
            <form:errors path="titulo" />
        </div>
        <div>
            <label>Descrição</label>
            <form:textarea rows="10" cols="20" path="descricao" />
            <form:errors path="descricao" />
        </div>
        <div>
            <label>Páginas</label> 
            <form:input path="paginas" />
            <form:errors path="paginas" />
        </div>
        <div>
            <label>Data de Lançamento</label>
            <form:input path="dataLancamento" />
            <form:errors path="dataLancamento" />
        </div>
        <div>
            <label>Sumário</label>
            <form:input path="dataLancamento" />
            <input name="sumario" type="file" />
        </div>
        <div>
            <c:forEach items="${tipos}" var="tipoPreco" varStatus="status">
                <div>
                    <label>${tipoPreco}</label> 
                    <form:input path="precos[${status.index}].valor" />
                    <form:hidden path="precos[${status.index}].tipo" value="${tipoPreco}" />
                </div>
            </c:forEach>
        </div>
        <button type="submit">Cadastrar</button>
    </form:form>
</body>
</html>

Um pouco mais para frente no curso ele usa essa outra taglib do prefixo s e ai faz o action

${s:mvcUrl('PC#grava').build() }

Mas é equivalente ao que você está fazendo, eu acabei usando aquela taglib form, não me lembro pq. Uma outra ideia seria você tentar fazer o seguinte com o seu codigo:

Adiciona a taglib:

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<form action='<c:url value="/produto" />'method="POST" enctype="multipart/form-data">

.... 
</form:form>

Troquei por aspas simples e o erro continua, não sei mais o que pode ser, já que tenho esse form em outro jsp pra cadastro de usuário e está funcionando normalmente:

        <form action="<c:url value="/user" />" method="POST" enctype="multipart/form-data">

            <div>
                Usuario: <input type="text" name="nome">
            </div>

            <div>
                Senha: <input type="password" name="senha">
            </div>

            <div>
                email: <input type="text" name="email">
            </div>

            <div>
                Imagem: <input type="file" name="imagem" value="Escolher">
            </div>

            <div>
                <input type="submit" value="Cadastrar">
            </div>

        </form>

Nem imagino mais o que pode estar causando esse erro

Considere esse código aqui:

<form:form action='<c:url value="/produto" />'method="POST" enctype="multipart/form-data">

.... 
</form:form>

Oi Rafael, fiz dessa forma e recebo o erro "GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/loja] threw exception [/WEB-INF/views/produtos/form.jsp (line: 18, column: 35) Unterminated <form:form tag] ". O jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="../resources/css/bootstrap.min.css">
<link rel="stylesheet" href="../resources/css/bootstrap-theme.min.css">
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

    <%@ include file="../cabecalho.jsp" %>

    <div>
        <form:form action="<c:url value="/produto" />" method="POST" enctype="multipart/form-data">

            <div>
                Nome:: <input type="text" name="nome">
            </div>

            <div>
                Descrição:
                <textarea rows="5" cols="20" name="descricao"></textarea>
            </div>

            <div>
                Preço: <input type="text" name="preco">
            </div>

            <div>
                Categoria:
                <select name="categoria">
                    <option value="">Selecione</option>
                    <c:forEach items="${categorias}" var="categoria">
                        <option value="${categoria}">${categoria.nome}</option>
                    </c:forEach>
                </select>
            </div>

            <div>
                Imagem: <input type="file" name="imagem" value="Escolher">
            </div>

            <div>
                <input type="submit" value="Cadastrar">
            </div>

        </form:form >
solução!

Resolvi! Era algum problema na pasta em que estava o jsp, criei um novo folder dentro de views pa substituir o antigo e passei os jsps pra lá, agora funciona normalmente. Acho que fiz alguma besteira enquanto criava as pastas, enfim. Obrigada pela atenção Rafael.