Solucionado (ver solução)
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.