Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

HTTP Status 500 - Request processing failed

Mesmo Após realizar os procedimentos de configuração, criação da pasta ao tentar inserir um novo produto, o sistema retorna o erro, como se não estivesse encontrando a pasta.

HTTP Status 500 - Request processing failed; nested exception is java.lang.RuntimeException: java.io.IOException: java.io.FileNotFoundException: C:\Users\henrique.santos\Desktop\Henrique\Projetos\SPRING\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\casadocodigo\arquivos-sumario\C:\arquivo.xml (The filename, directory name, or volume label syntax is incorrect)

** Pelo que reparei aqui, a criação do arquivo não está capturando a pasta do jforge e sim o metadata do eclipse. Mas o meta data não está enxergando a pasta

Classes:

package br.com.casadocodigo.loja.infra;

import java.io.File;
import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

@Component
public class FileSaver {

    @Autowired
    private HttpServletRequest request;

    public String write(String baseFolder, MultipartFile file) {
        try {
            String realPath = request.getServletContext().getRealPath("/" + baseFolder);
            String path = realPath + "/" + file.getOriginalFilename();
            file.transferTo(new File(path));
            return path;
        } catch (IllegalStateException | IOException e) {
            throw new RuntimeException(e);
        }
    }

}
package br.com.casadocodigo.loja.controllers;

import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import br.com.casadocodigo.loja.dao.ProdutoDAO;
import br.com.casadocodigo.loja.enums.TipoPreco;
import br.com.casadocodigo.loja.infra.FileSaver;
import br.com.casadocodigo.loja.models.Produto;
import br.com.casadocodigo.loja.validation.ProdutoValidation;

@Controller
@RequestMapping("/produtos")
public class ProdutosController {

    @Autowired
    private ProdutoDAO produtoDao;

    @Autowired
    private FileSaver fileSaver;

    @RequestMapping("/form")
    public ModelAndView form(Produto produto) {

        ModelAndView modelAndView = new ModelAndView("produtos/form");
        modelAndView.addObject("tipos", TipoPreco.values());

        return modelAndView;
    }

    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView gravar(MultipartFile sumario, @Valid Produto produto, BindingResult result, RedirectAttributes redirectAttributes) {

        if (result.hasErrors()) {
            return form(produto);
        }

        String path = fileSaver.write("arquivos-sumario", sumario);
        produto.setSumarioPath(path);

        produtoDao.save(produto);
        redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso!");
        return new ModelAndView("redirect:produtos");
    }

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView listar() {
        List<Produto> produtos = produtoDao.listar();
        ModelAndView modelAndView = new ModelAndView("/produtos/lista");
        modelAndView.addObject("produtos", produtos);
        return modelAndView;
    }

    @InitBinder
    public void InitBinder(WebDataBinder binder) {
        binder.addValidators(new ProdutoValidation());
    }

}

Estrutura da pasta:

src > main > webapp > arquivos-sumario

4 respostas

Ola Henrique, tudo bem ?

O eclipse está tentando salvar os arquivos na pasta temporária (padrão do plugin wtp). O que pode estar dando problema.

Tente fazer assim, configure para que o eclipse gerencie o servidor instalado direto na pasta de instalação do tomcat na sua máquina. Vá na aba servers, dê dois cliques no servidor e verifique a opção Server Locations, selecione a opção Use Tomcat Instalation (takes controll of tomcat instalation). Agora o eclipse ao invés de salva na pasta temporária interna, salva direto na pasta de instalação do tomcat. Pode ajudar.

Importante: Caso já tenha instalado e rodado a app no servidor a opção estará indisponível. Nesse caso remova a app do servidor e o próprio servidor. Reinstale o servidor, de dois cliques configure a opção pra tomar o controle da pasta de instalação e depois adicione a app e rode.

Espero ter ajudado. Abraço!

Rafael, realizei o procedimento conforme informado. O caminho até mudou, mas o erro persiste.

HTTP Status 500 - Request processing failed; nested exception is java.lang.RuntimeException: java.io.IOException: java.io.FileNotFoundException: C:\Users\henrique.santos\Desktop\Henrique\tomcat\apache-tomcat-8.5.9\wtpwebapps\casadocodigo\WEB-INF\arquivos-sumario\C:\arquivo.xml (The filename, directory name, or volume label syntax is incorrect)

Quando realizo o teste criando um arquivo vazio e novo a operação é realizada com sucesso.

public String write(String baseFolder, MultipartFile file) {
        try {
            String realPath = request.getServletContext().getRealPath("/"+baseFolder);
            //String path = realPath + "/" + file.getOriginalFilename();
            file.transferTo(new File(realPath + "/" + "teste.jpg"));
            return "";

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

Opa Henrique,

Olhando agora percebi uma coisa: casadocodigo\WEB-INF\arquivos-sumario\C:\arquivo.xml. Depois da pasta \arquivos-sumario\ aparece novamente C:\, ao invés de apenas o nome do arquivo e extensão.

Tente verificar por que o existe novamente o C:\ antes do nome do arquivo. Imprima as Strings do caminho isoladamente. Suspeito que seja produto do método getOriginalFileName(). Pode ser por isso que quando tenta com um nome de arquivo fixo funciona.

solução!

Rafael, sua consultoria resolveu meu problema. Obrigado.

Realizei apenas a transformação do MultipartFile para File, com isso o programa passou a enxergar o nome apenas do arquivo do upload ao invés do caminho real.

public String write(String baseFolder, MultipartFile file) {
        try {
            String realPath = request.getServletContext().getRealPath("/" + baseFolder);

            File temp_file = new File(file.getOriginalFilename());
            String path = realPath + "/" + temp_file.getName();

            file.transferTo(new File(path));
            return path;
        } catch (IllegalStateException | IOException e) {
            throw new RuntimeException(e);
        }
    }