O caminho é salvo normalmente no BD e nenhuma exception é lançada, mas ele nunca acaba enviado ao diretório escolhido, procuro manualmente pelo arquivo no Finder do Mac e ele só existe na pasta de onde selecionei ele mesmo.
O caminho é salvo normalmente no BD e nenhuma exception é lançada, mas ele nunca acaba enviado ao diretório escolhido, procuro manualmente pelo arquivo no Finder do Mac e ele só existe na pasta de onde selecionei ele mesmo.
Oi Nicolas,
Coloca aqui como está o código das suas classes, para vermos se tem algum problema.
AppWebConfig
package br.com.nick.casadocodigo.loja.conf;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.format.datetime.DateFormatterRegistrar;
import org.springframework.format.support.DefaultFormattingConversionService;
import org.springframework.format.support.FormattingConversionService;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.support.StandardServletMultipartResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import br.com.casadocodigo.loja.controllers.HomeController;
import br.com.casadocodigo.loja.dao.ProdutoDAO;
import br.com.casadocodigo.loja.infra.FileSaver;
@EnableWebMvc
@ComponentScan(basePackageClasses= {HomeController.class, ProdutoDAO.class, FileSaver.class})
public class AppWebConfiguration extends WebMvcConfigurerAdapter {
@Bean
public InternalResourceViewResolver internalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix( ".jsp");
return resolver;
}
@Bean
public MessageSource messageSource(){
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("/WEB-INF/messages");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(1);
return messageSource;
}
@Bean
public FormattingConversionService mvcConversionService() {
DefaultFormattingConversionService conversionService =
new DefaultFormattingConversionService();
DateFormatterRegistrar registrar = new DateFormatterRegistrar();
registrar.setFormatter(new DateFormatter("dd/MM/yyyy"));
registrar.registerFormatters(conversionService);
return conversionService;
}
@Bean
public MultipartResolver multipartResolver(){
return new StandardServletMultipartResolver();
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
FileSaver
package br.com.nick.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);
}
}
}
Controller
package br.com.nick.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.dao.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 dao;
@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);
dao.gravar(produto);
redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso!");
return new ModelAndView("redirect:produtos");
}
@RequestMapping(method = RequestMethod.GET)
public ModelAndView listar() {
List<Produto> produtos = dao.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 = dao.find(id);
modelAndView.addObject("produto", produto);
return modelAndView;
}
}
Oi Nicolas,
O codigo esta correto.
Você também criou esse método na classe AppWebConfiguration ?
@Override
protected void customizeRegistration(Dynamic registration) {
registration.setMultipartConfig(new MultipartConfigElement(""));
}
Como no seu caso o diretório onde os arquivos serão salvos é uma pasta dentro do próprio projeto, no Eclipse você precisa dar um refresh no projeto, para que o arquivo aparece após o upload.
Então Rodrigo, com relação ao refresh eu sempre fico atento, mas respondendo sua pergunta, eu não criei o método não, mas daí eu não teria que estender de outra classe? Pq eu só coloquei ele na classe SpringWebServlet
Oi Nicolas, eu falei errado. Na verdade esse método que falei fica na classe SpringWebServlet mesmo.
Talvez o problema seja então que o Spring não consiga salvar o arquivo no diretório do próprio projeto.
Teste salvando em outro diretório no seu computador. Por exemplo:
String homePath = System.getProperty("user.home");
String baseFolderPath = homePath + "/" +baseFolder;
String path = baseFolderPath +"/" +file.getOriginalFilename();
Assim ele vai salvar no diretório do seu usuário.
Veja se funciona.
Opa Rodrigo, agora sim funcionou!!! Obrigado cara, agora eu referencio a partir dos diretorios do computador até a pasta de projeto?
Os arquivos que forem feitos upload serão gravados nesse diretório que fica fora do projeto.
Se você quiser uma funcionalidade para fazer download dos arquivos, bastaria criar uma lógica que baixa o arquivo a partir desse mesmo diretório.
Assim o que vai acontecer é que esse diretorio não tem relação diretamente com o projeto.
Certo! Muito obrigado Rodrigo!