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

Imagem não está sendo salva

A imagem selecionada não está sendo salva na pasta "arquivos-sumario' dentro do projeto, mas sim em uma pasta temporária do servidor.

Caminho onde a imagem está sendo salva:

...\.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\casadocodigo\arquivos-sumario/java8-featured_large.png

Caminho onde ela deveria estar sendo salva:

...\casadocodigo\src\main\webapp\arquivos-sumario/java8-featured_large.png

Código do FileSaver:

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 baseFolder + "/" + file.getOriginalFilename();

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

}

Código ProdutosController

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.PathVariable;
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.daos.ProdutoDAO;
import br.com.casadocodigo.loja.infra.FileSaver;
import br.com.casadocodigo.loja.models.Produto;
import br.com.casadocodigo.loja.models.TipoPreco;
import br.com.casadocodigo.loja.validation.ProdutoValidation;

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

    @Autowired
    private ProdutoDAO produtoDao;

    @Autowired
    private FileSaver fileSaver;

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


    @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.gravar(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;
    }


    @RequestMapping("/detalhe/{id}")
    public ModelAndView detalhe(@PathVariable("id") Integer id) {
        ModelAndView modelAndView = new ModelAndView("produtos/detalhe");
        Produto produto = produtoDao.find(id);
        modelAndView.addObject("produto", produto);

        return modelAndView;
    }

}
4 respostas

Esse problema provavelmente é porque você está executando seu projeto diretamente no eclipse. Quando você faz isso, este é o local onde o nosso WAR reside (dentro do seu workspace). Esse caminho é usado pelo eclipse.

Sobe seu projeto num tomcat que o arquivo irá ser armazenado no local desejado.

Otávio, você poderia me orientar por favor na forma correta de subir o projeto diretamente pelo tomcat, sem utilizar o Eclipse?

solução!

Fala Welton,

Claro amigo, vamos lá.

Entra no diretório raiz do seu projeto (onde fica o arquivo pom.xml), abra um terminal e rode:

mvn clean deploy

Após o término do comando acima, vá na pasta target do seu projeto e copie o arquivo casadocodigo.war para dentro de "apache-tomcat-8.5.40\webapps"

Se não tiver o tomcat, pode baixar o zip aqui: https://tomcat.apache.org/download-80.cgi

Para fazer o start do tomcat basta executar o "startup" dentro da pasta bin do mesmo.

Otávio, muito obrigado pela ajuda!

Funcionou perfeitamente.