public void salva(UploadedFile imagem, Produto produto) {
File destino = new File(pastaImagens, produto.getId() + ".imagem");
try {
IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));
}catch (IOException e) {
throw new RuntimeException("Erro ao copiar imagem", e);
}
(Resolvido) Upload com Vraptor
53 Respostas
Galera era o import, peguei o da pasta do Vraptor e funcionou
Obrigado
Vamos a outro erro.
No metodo de upload
@Post @Path("/admin/{produto.id}/imagem")
public void upload(Produto produto, UploadedFile imagem) {
validator.checking(new Validations() {{
if (that(imagem, is(notNullValue()), "imagem", "imagem.nula")) {
that(imagem.getContentType(), startsWith("image"), "imagem", "nao.eh.imagem");
}
}});
validator.onErrorRedirectTo(ProdutosController.class).edita(produto.getId());
imagens.salva(imagem, produto);
result.redirectTo(ProdutosController.class).edita(produto.getId());
}
Este trecho nao compila
if (that(imagem, is(notNullValue()), "imagem", "imagem.nula")) {
that(imagem.getContentType(), startsWith("image"), "imagem", "nao.eh.imagem");
No netbeans ao clicar nas dicas ele pede para tornar como final o UploadedFile imagem faço isso e nada acontece
Alguem ai sabe oque fazer?
você precisa de um import estático em org.hamcrest.Matchers.* pra esse código funcionar
Pesquisando no forum eu importei a biblioteca hancrest e o erro sumiu
mais agora na hora de subir o glasfihs ele da o seguinte erro na biblioteca
INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
GRAVE: Exception while loading the app
org.glassfish.deployment.common.DeploymentException: java.lang.NoClassDefFoundError: org/hamcrest/Description
at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:167)
at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:125)
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:224)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:338)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:183)
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:272)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:305)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:320)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1176)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$900(CommandRunnerImpl.java:83)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1235)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1224)
at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:365)
at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:204)
at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:166)
at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:100)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:245)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
at java.lang.Thread.run(Thread.java:619)
Caused by: com.google.common.collect.ComputationException: java.lang.NoClassDefFoundError: org/hamcrest/Description
at com.google.common.collect.MapMaker$StrategyImpl.compute(MapMaker.java:602)
at com.google.common.collect.MapMaker$StrategyImpl.compute(MapMaker.java:462)
at com.google.common.collect.CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2045)
at org.jboss.weld.resources.ClassTransformer.loadClass(ClassTransformer.java:164)
at org.jboss.weld.bootstrap.BeanDeployer.addClass(BeanDeployer.java:61)
at org.jboss.weld.bootstrap.BeanDeployer.addClasses(BeanDeployer.java:88)
at org.jboss.weld.bootstrap.BeanDeployment.deployBeans(BeanDeployment.java:134)
at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:377)
at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:165)
... 30 more
Caused by: java.lang.NoClassDefFoundError: org/hamcrest/Description
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
at java.lang.Class.getConstructor0(Class.java:2699)
at java.lang.Class.getDeclaredConstructor(Class.java:1985)
at org.jboss.weld.util.reflection.SecureReflections$10.work(SecureReflections.java:239)
at org.jboss.weld.util.reflection.SecureReflections$10.work(SecureReflections.java:235)
at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:54)
at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsMethodAccess(SecureReflectionAccess.java:119)
at org.jboss.weld.util.reflection.SecureReflections.getDeclaredConstructor(SecureReflections.java:234)
at org.jboss.weld.util.Proxies.isClassProxyable(Proxies.java:248)
at org.jboss.weld.util.Proxies.isTypeProxyable(Proxies.java:201)
at org.jboss.weld.util.Proxies.isTypesProxyable(Proxies.java:229)
at org.jboss.weld.introspector.jlr.AbstractWeldAnnotated.<init>(AbstractWeldAnnotated.java:179)
at org.jboss.weld.introspector.jlr.WeldClassImpl.<init>(WeldClassImpl.java:145)
at org.jboss.weld.introspector.jlr.WeldClassImpl.of(WeldClassImpl.java:140)
at org.jboss.weld.resources.ClassTransformer$TransformTypeToWeldClass.apply(ClassTransformer.java:50)
at org.jboss.weld.resources.ClassTransformer$TransformTypeToWeldClass.apply(ClassTransformer.java:38)
at com.google.common.collect.MapMaker$StrategyImpl.compute(MapMaker.java:592)
... 38 more
Caused by: java.lang.ClassNotFoundException: org.hamcrest.Description
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at org.glassfish.web.loader.WebappClassLoader.findClass(WebappClassLoader.java:959)
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1430)
... 56 more
vc tá com o jar do hamcrest no WEB-INF/lib?
Eu uso o netbeans e nele nao tem a pasta lib no WEB_INF
eu so adiciono o jar em bibliotecas e boa
EU Nao consigo entender fechei e abri o netbenas e funcionou.
Mais eu ja tinha feito isso umas 4 vezes
Agora quando vou inserir a imagem da o sequinte erro.
br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.util.MissingResourceException: Can’t find bundle for base name messages, locale pt_BR
bom, vc adicionou o jar do hamcrest que vem no zip do vraptor?
se sim esse código deveria funcionar. tenta dar um clean no projeto e no servidor e reiniciar tudo
precisa de um arquivo chamado messages.properties no classpath (estranho, não deveria precisar disso na última versão do vraptor)
vc pode criar esse arquivo na sua pasta src (ou src/main/resources)
precisa de um arquivo chamado messages.properties no classpath (estranho, não deveria precisar disso na última versão do vraptor)vc pode criar esse arquivo na sua pasta src (ou src/main/resources)
Desculpa a minha ignorancia mais o Vraptor foi vc quem criou?
hauahahuaa
Vc sabe tudo
eu não criei, mas sou um dos desenvolvedores 
Esta entendido entao rsss.
Bom esta dando erro 405 mais eu creio que este é por causa de erros nao nas imagens
vou postar aqui meus codigos para ver se pode me ajudar.
primeiro o edita.jsp
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<html>
<head>
<title>Produtos</title>
<link href="<c:url value="/goodbuy.css"/>" rel="stylesheet" type="text/css" media="screen" />
<link href="<c:url value="/javascripts/jquery.autocomplete.css"/>" rel="stylesheet" type="text/css" media="screen" />
<script type="text/javascript" src="<c:url value="/javascripts/jquery-1.3.2.min.js"/>"></script>
<script type="text/javascript" src="<c:url value="/javascripts/jquery.validate.min.js"/>"></script>
<script type="text/javascript" src="<c:url value="/javascripts/jquery.autocomplete.min.js"/>"></script>
<script type="text/javascript" src="<c:url value="/javascripts/jquery.puts.js"/>"></script>
<fmt:setLocale value="pt_br"/>
</head>
<body>
<table width="100%">
<tr>
<td>
<%@ include file="/header1.jspf" %>
</td>
</tr>
</table>
<form action="<c:url value="/admin/${produto.id }"/>" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>Editar Produto</legend>
<input type="hidden" name="produto.id" value="${produto.id }" />
<label for="nome">Nome:</label>
<input id="nome" type="text" name="produto.nome" value="${produto.nome }"/>
<label for="descricao">Descrição:</label>
<textarea id="descricao" cols="30" rows="10" name="produto.descricao">${produto.descricao }</textarea>
<label for="preco">Preço:</label>
<input id="preco" type="text" name="produto.preco" value="${produto.preco }"/>
<label for="peso">Peso:</label>
<input id="peso" type="text" name="produto.peso" value="${produto.peso }"/>
<legend>Upload de Imagem</legend>
<input type="file" name="imagem" />
<button type="submit">Enviar</button>
</fieldset>
</form>
<script type="text/javascript">
$('#produtosForm').validate();
</script>
</body>
</html>
Agora o ProdutosController
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.caelum.goodbuy.controller;
import br.com.caelum.goodbuy.dao.ProdutoDao;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Put;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.ValidationMessage;
import br.com.caelum.vraptor.view.Results;
import java.util.List;
/**
*
* @author Fred
*/
@Resource
public class ProdutosController {
private final ProdutoDao dao;
private final Result result;
private final Validator validator;
public ProdutosController(ProdutoDao dao, Result result, Validator validator) {
this.dao = dao;
this.result = result;
this.validator = validator;
}
@Get @Path("/produtos")
public List<Produto> lista() {
return dao.listaTudo();
}
@Post @Path("/produtos")
public void adiciona(final Produto produto) {
if (produto.getNome() == null || produto.getNome().length() < 3) {validator.add(new ValidationMessage("Nome é obrigatório e precisa ter mais de 3 letras", "produto.nome"));
}
if (produto.getDescricao() == null || produto.getDescricao().length() > 40) {validator.add(new ValidationMessage("Descrição é obrigatória não pode ter mais que 40 letras","produto.descricao"));
}
if (produto.getPreco() <= 0) {validator.add(new ValidationMessage("Preço precisa ser positivo", "produto.preco"));
}
validator.onErrorUsePageOf(ProdutosController.class).formulario();
dao.salva(produto);
result.redirectTo(this).lista1();
}
@Get @Path("/admin/novo")
public void formulario() {
}
@Get @Path("/admin/admin")
public List<Produto> lista1() {
return dao.listaTudo();
}
@Get @Path("/admin/{id}")
public Produto edita(Long id) {
return dao.carrega(id);
}
@Put @Path("/admin/{produto.id}")
public void altera(Produto produto) {
dao.atualiza(produto);
result.redirectTo(this).lista1();
}
@Delete @Path("/admin/{id}")
public void remove(Long id) {
Produto produto = dao.carrega(id);
dao.remove(produto);
result.redirectTo(this).lista1();
}
@Get @Path("/produtos/busca")
public List<Produto> busca(String nome) {
result.include("nome", nome);
return dao.busca(nome);
}
@Get @Path("/produtos/busca.json")
public void buscaJson(String nome) {
result.use( Results.json()).withoutRoot()
.from(dao.busca(nome))
.exclude("id", "descricao")
.serialize();
}
}
ProdutoDao:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.caelum.goodbuy.dao;
import br.com.caelum.goodbuy.infra.CriadorDeSession;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.ioc.Component;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
/**
*
* @author Fred
*/
@Component
public class ProdutoDao {
private final Session session;
public ProdutoDao() {
this.session = CriadorDeSession.getSession();
}
public void salva(Produto produto) throws HibernateException {
Transaction tx = session.beginTransaction();
session.save(produto);
tx.commit();
}
public void atualiza(Produto produto) {
Transaction tx = session.beginTransaction();
this.session.update(produto);
tx.commit();
}
public void remove(Produto produto) {
Transaction tx = session.beginTransaction();
this.session.delete(produto);
tx.commit();
}
public List<Produto> listaTudo() {
return this.session.createCriteria(Produto.class).list();
}
public Produto carrega(Long id) {
return (Produto) this.session.load(Produto.class, id);
}
public List<Produto> busca(String nome) {
return session.createCriteria(Produto.class).add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE)).list();
}
public void recarrega(Produto produto) {
session.refresh(produto);
}
}
Bom quando clico em enviar ele da este erro 405
Hahaha eu coloquei PUT e nao POST ai dava errado mesmo rss
Bom mais agora nao acontece nada quando coloco a imagem e clico em enviar, ele simplesmente me rotorna a pagina sem alterar nada.
vai ai os codigos
Classe imagens:
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.caelum.goodbuy.imagens;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
import br.com.caelum.vraptor.ioc.Component;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.servlet.ServletContext;
import org.apache.commons.io.IOUtils;
/**
*
* @author Fred
*/
@Component
public class Imagens {
private File pastaImagens;
public Imagens(ServletContext context) {
String caminhoImagens = context.getRealPath("/WEB-INF/imagens");
pastaImagens = new File(caminhoImagens);
pastaImagens.mkdir();
}
public void salva(UploadedFile imagem, Produto produto) {
File destino = new File(pastaImagens, produto.getId() + ".imagem");
try {
IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));
}catch (IOException e) {
throw new RuntimeException("Erro ao copiar imagem", e);
}
}
public File mostra(Produto produto) {
return new File(pastaImagens, produto.getId() + ".imagem");
}
}
ImagensCOntroller
package br.com.caelum.goodbuy.controller;
import java.io.File;
import br.com.caelum.vraptor.Get;
import br.com.caelum.goodbuy.imagens.Imagens;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
import br.com.caelum.vraptor.validator.Validations;
import static org.hamcrest.Matchers.*;
/**
*
* @author Fred
*/
@Resource
public class ImagensController {
private final Validator validator;
private final Imagens imagens;
private final Result result;
public ImagensController(Validator validator, Imagens imagens, Result result) {
this.validator = validator;
this.imagens = imagens;
this.result = result;
}
@Post @Path("/admin/{produto.id}/imagem")
public void upload(Produto produto, final UploadedFile imagem) {
validator.checking(new Validations() {{
if (that(imagem, is(notNullValue()), "imagem", "imagem.nula")) {
that(imagem.getContentType(), startsWith("image"), "imagem", "nao.eh.imagem");
}
}});
validator.onErrorRedirectTo(ProdutosController.class).edita(produto.getId());
imagens.salva(imagem, produto);
result.redirectTo(ProdutosController.class).edita(produto.getId());
}
@Get @Path("/admin/{produto.id}/imagem")
public File download(Produto produto) {
return imagens.mostra(produto);
}
}
o edita.jsp
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<html>
<head>
<title>Produtos</title>
<link href="<c:url value="/goodbuy.css"/>" rel="stylesheet" type="text/css" media="screen" />
<link href="<c:url value="/javascripts/jquery.autocomplete.css"/>" rel="stylesheet" type="text/css" media="screen" />
<script type="text/javascript" src="<c:url value="/javascripts/jquery-1.3.2.min.js"/>"></script>
<script type="text/javascript" src="<c:url value="/javascripts/jquery.validate.min.js"/>"></script>
<script type="text/javascript" src="<c:url value="/javascripts/jquery.autocomplete.min.js"/>"></script>
<script type="text/javascript" src="<c:url value="/javascripts/jquery.puts.js"/>"></script>
<fmt:setLocale value="pt_br"/>
</head>
<body>
<table width="100%">
<tr>
<td>
<%@ include file="/header1.jspf" %>
</td>
</tr>
</table>
<form action="<c:url value="/admin/${produto.id }/imagem"/>" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>Editar Produto</legend>
<input type="hidden" name="produto.id" value="${produto.id }" />
<label for="nome">Nome:</label>
<input id="nome" type="text" name="produto.nome" value="${produto.nome }"/>
<label for="descricao">Descrição:</label>
<textarea id="descricao" cols="30" rows="10" name="produto.descricao">${produto.descricao }</textarea>
<label for="preco">Preço:</label>
<input id="preco" type="text" name="produto.preco" value="${produto.preco }"/>
<label for="peso">Peso:</label>
<input id="peso" type="text" name="produto.peso" value="${produto.peso }"/>
<legend>Upload de Imagem</legend>
<input type="file" name="imagem" />
<button type="submit">Enviar</button>
</fieldset>
</form>
<script type="text/javascript">
$('#produtosForm').validate();
</script>
</body>
</html>
Opa amigo, já passei por isso antes. (vou lhe falar uma coisa, mas nao tenho certeza), separa o upload da imagem do cadastro do produto. pois já fiz esse exercício da FJ28 e tive problemas com isso. o envio da imagem nao da certo com o cadastro. segundo um professor meu é por causa do protocolo HTTP. Na época que me ajudou fou o Lucas tb. o post é esse ai…http://www.guj.com.br/java/218906-upload-de-imagens-com-vraptor da uma olhada… qlqr coisa posta suas dúvidas novamente… vlw
[quote=well]Opa amigo, já passei por isso antes. (vou lhe falar uma coisa, mas nao tenho certeza), separa o upload da imagem do cadastro do produto. pois já fiz esse exercício da FJ28 e tive problemas com isso. o envio da imagem nao da certo com o cadastro. segundo um professor meu é por causa do protocolo HTTP. Na época que me ajudou fou o Lucas tb. o post é esse ai…http://www.guj.com.br/java/218906-upload-de-imagens-com-vraptor da uma olhada… qlqr coisa posta suas dúvidas novamente… vlw [/quote
well Eu sou muito cru com isso, vc tem ai uma dica ou tutorial para me ajudar?
vi no seu topico que vc fez ao adicionar o produto ele chama uma tela para por a imagem correto?
como fez isso?
@Post @Path("/produtos")
public void adiciona(Produto produto) {
dao.adiciona(produto);
result.redirectTo(ProdutosController.class).lista();
}
<label for ="imagem">Imagem:</label>
<a href="<c:url value="/produtos/${produto.id}/editaFoto" />"><img alt="Alterar Imagem" title="Alterar Imagem" src="<c:url value="/bcis/${bci.inscricaoCadastral }/imagem"/>" width="20px" height="20px"></img></a><br />
<button type="submit" name="_method" value="PUT">Alterar</button>
ai blz, vai alterar a foto daquele produto...
ai no imagens controller vc redireciona para onde desejar...@Post
@Path("/produtos/{produto.id}/imagem")
public void upload(Produto produto, final UploadedFile imagem) throws IOException{
imagens.upload(imagem, produto);
result.redirectTo(ProdutosController.class).lista();
}
result.redirectTo(ProdutosController.class).adiciona();
nao é o mais usual para o cliente, mas na pressa... já ajuda... :)
é pra um projeto da facu ja serve sim.
amanha bem cedo eu tento, estou a 2 dias sem dormir heeheh nao ta funcionando mais o cerebro
Obrigado cara
tentei e nao conseguir rsssss
Bom vamos la heheehe e segue a jornada rsss.
Bom seguindo os passos do Well no listar eu coloquei um link para alterar a foto:
<td><label for ="imagem">Imagem:</label>
<a href="<c:url value="/admin/${produto.id}/editafoto" />"><img alt="Alterar Imagem" title="Alterar Imagem" src="<c:url value="/bcis/${bci.inscricaoCadastral }/imagem"/>" width="20px" height="20px"></img></a><br /></td>
Dentro da pasta produtos eu criei um formulario chamado edita foto.
No ProdutosController eu fiz assim:
@Get @Path("/admin/${produto.id}/editafoto")
public void editafoto() {
}
Era pra trazer o formulario nao?
ele da erro 404!
tira o $ do @Path:
@Get @Path("/admin/{produto.id}/editafoto")
tira o $ do @Path:
@Get @Path("/admin/{produto.id}/editafoto")
Ok lucas deu certinho.
Agora vamos la
fiz este form.
<form action="<c:url value="/admin/${produto.id}/imagem"/>" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>Editar Produto</legend>
<legend>Upload de Imagem</legend>
<input type="file" name="imagem" />
<button type="submit" name="_method" value="POST">Alterar</button>
Meu controler esta assim:
@Post @Path("/admin/{produto.id}/imagem")
public void upload(Produto produto, final UploadedFile imagem) {
validator.checking(new Validations() {{
if (that(imagem, is(notNullValue()), "imagem", "imagem.nula")) {
that(imagem.getContentType(), startsWith("image"), "imagem", "nao.eh.imagem");
}
}});
validator.onErrorRedirectTo(ProdutosController.class).edita(produto.getId());
imagens.salva(imagem, produto);
result.redirectTo(ProdutosController.class).edita(produto.getId());
}
Deveria funcionar assim nao e?
Mais nao funciona, quando o form a url vem assim:
http://localhost:8080/modular1/admin/7/editafoto
depois que eu pego a imagem e clico em alterar
ele retira o Id do produto e fica assim:
http://localhost:8080/modular1/admin//imagem
E nada acontece.
Alguma luz no fim do tuneo?
rsss
vc precisa incluir um produto no result, pra poder usar ${produto.id} no jsp pra gerar a url
Esse edita foto seu ai ta furado, vc tem que pegar o id do produto, o qual é o mesmo nome da foto, para poder achar a imagem,
tenta assim:
@Get @Path("/produtos/{id}/editaFoto")
public Produto editaFoto(Integer id) {
return dao.busca(id);
}
Desculpa minha ignorância mais como eu faço isso?
Obrigado
assim como o well falou 
Lucas mais eu fiz isso
@Post @Path("/admin/{produto.id}/imagem")
public void upload(Produto produto, final UploadedFile imagem) {
validator.checking(new Validations() {{
if (that(imagem, is(notNullValue()), "imagem", "imagem.nula")) {
that(imagem.getContentType(), startsWith("image"), "imagem", "nao.eh.imagem");
}
}});
validator.onErrorRedirectTo(ProdutosController.class).edita(produto.getId());
imagens.salva(imagem, produto);
result.redirectTo(ProdutosController.class).edita(produto.getId());
}
sim, mas no método edita vc precisa fazer um:
result.include("produto", produto);
//ou
return produto;
sim, mas no método edita vc precisa fazer um:O Metodo edita na produtocontroller certo? segue o metodo:result.include("produto", produto); //ou return produto;
@Get @Path("/admin/{id}")
public Produto edita(Long id) {
return dao.carrega(id);
}
Onde eu colocaria este codigo que vc me passou?
Obrigado
bom, isso já deveria funcionar então… a menos que o dao.carrega(id); esteja retornando null
Olha meu Dao
public Produto carrega(Long id) {
return (Produto) this.session.load(Produto.class, id);
}
ele esta retornando o produto nao?
no edita.jsp vc está colocando a url com ${produto.id} e não está indo?
deveria funcionar…
tenta imprimir as outras propriedades do produto e ver se sai alguma coisa…
vc tem o método getId na classe produto?
no edita.jsp vc está colocando a url com ${produto.id} e não está indo?deveria funcionar…
tenta imprimir as outras propriedades do produto e ver se sai alguma coisa…
vc tem o método getId na classe produto?
eu nao estou usando o arquivo edita.jsp estou usando um formulario so pra por a foto chamado editafoto.jsp
a url esta assim value="/admin/${produto.id}/imagem"
e sim tenho o getId
posta aqui a lógica editafoto()
eu tenho o edita foto la no ProdutoController para chamar o arquivo editafoto
ai quando vou enviar a foto eu uso o:
@Post @Path("/admin/{produto.id}/imagem")
public void upload(Produto produto, final UploadedFile imagem) {
validator.checking(new Validations() {{
if (that(imagem, is(notNullValue()), "imagem", "imagem.nula")) {
that(imagem.getContentType(), startsWith("image"), "imagem", "nao.eh.imagem");
}
}});
validator.onErrorRedirectTo(ProdutosController.class).edita(produto.getId());
imagens.salva(imagem, produto);
result.redirectTo(ProdutosController.class).edita(produto.getId());
result.include("produto", produto);
}
estou fazendo tudo errado ne?
tudo bem… mas cadê o editafoto do ProdutoController?
Ele so esta assim
@Get @Path("/admin/{produto.id}/editafoto")
public void editafoto() {
}
então, a idéia é que vc precisa incluir o produto no result (como eu falei antes), senão vc não consegue chamar ${produto.id} no jsp.
faça isso:
@Get @Path("/admin/{produto.id}/editafoto")
public Produto editafoto(Produto produto) {
return produto;
}
se vc precisar acessar qqer outra propriedade fora o id do produto, use
return dao.carrega(produto.getId());
então, a idéia é que vc precisa incluir o produto no result (como eu falei antes), senão vc não consegue chamar ${produto.id} no jsp.faça isso:
@Get @Path("/admin/{produto.id}/editafoto") public Produto editafoto(Produto produto) { return produto; }se vc precisar acessar qqer outra propriedade fora o id do produto, use
return dao.carrega(produto.getId());
valeu Lucas, pelo eu ainda aprendo este negocio rsss.
a 3 dias nunca havia falar em vraptor e sabia java de ouvir falar hauahuahuahaa. rss
agora ele esta apresentando o seguinte erro:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'imagensController': Unsatisfied dependency expressed through constructor argument with index 3 of type [br.com.caelum.goodbuy.modelo.Produto]: : No matching bean of type [br.com.caelum.goodbuy.modelo.Produto] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [br.com.caelum.goodbuy.modelo.Produto] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
não é pra receber o produto no construtor, e sim no método.
Blz lucas arrumado, agora nao da erro ele redireciona normal mais nao esta gravando a imagem la na pasta estranho isso rss.
na classe imagem esta assim
private File pastaImagens;
public Imagens(ServletContext context) {
String caminhoImagens = context.getRealPath("/WEB-INF/imagens");
pastaImagens = new File(caminhoImagens);
pastaImagens.mkdir();
}
o formulário está como multipart-form-data? o uploadedFile está vindo preenchido? vc está copiando o getFile para um arquivo nessa pasta?
sim o form esta
<form action="<c:url value="/admin/${produto.id}/imagem"/>" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>Editar Produto</legend>
<legend>Upload de Imagem</legend>
<input type="file" name="imagem" />
<button type="submit" name="_method" value="POST">Alterar</button>
</fieldset>
</form>
meu updatefile esta assim
public void salva(UploadedFile imagem, Produto produto) {
File destino = new File(pastaImagens, produto.getId() + ".imagem");
try {
IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));
}catch (IOException e) {
throw new RuntimeException("Erro ao copiar imagem", e);
}
}
tente colocar uma outra pasta…
se vc está rodando o servidor pelo netbeans ou eclipse, a pasta WEB-INF/ não é a mesma da sua aplicação, é uma interna…
tenta colocar um caminho fixo para a pasta imagens, tipo “C:\Imagens”
tente colocar uma outra pasta…se vc está rodando o servidor pelo netbeans ou eclipse, a pasta WEB-INF/ não é a mesma da sua aplicação, é uma interna…
tenta colocar um caminho fixo para a pasta imagens, tipo “C:\Imagens”
Opa eu coloquei ai ele deu um erro mais no erro vi o caminho que o netbeans salva e criei a pasta la dentro e deu certo.
Ele esta colocando a extensao .imagem, eu posso alterar na classe para ele gravar .jpg? ou deixo .imagem mesmo?
Obrigado!!!
pode gravar com a extensão que vc quiser… só cuidado na hora de abrir 
O Upload esta feito agora para mostrar esta imagem na tela eu coloquei o seguinte codigo
<a href="<c:url value="/admin/${produto.id}/editafoto" />"><img alt="Alterar Imagem" title="Alterar Imagem" src="<c:url value="/imagens/${produto.id}/imagem"/>" width="20px" height="20px"></img></a><br /></td
Esta é a parte em questao
src="<c:url value="/imagens/${produto.id}/imagem"/>
Esta correto?
bom, se essa lógica retorna um File ou InputStream ou Download da imagem, sim 
Sim a logica retorna um file
public File mostra(Produto produto) {
return new File(pastaImagens, produto.getId() + ".imagem");
}
Mais nada aparece onde estou errando?
Grato
tenta copiar a url que cai nessa lógica direto no browser. Aparece a imagem?
a imagem do id passado existe na pasta?
tenta copiar a url que cai nessa lógica direto no browser. Aparece a imagem?a imagem do id passado existe na pasta?
sim o id esta sim
9.imagem
O caminho completo seria este
C:\Users\Fred\Documents\NetBeansProjects\modular1\build\web\imagens
mais no netbeans eu so coloco o caminho como imagens
Achei o erro a url estava assim: src="<c:url value="/imagens/${produto.id}/imagem"/>
eu mudei para src="<c:url value="/imagens/${produto.id}.imagem"/>
e funcionou!
Gostaria de Agradecer aqui a todos que me ajudaram.
Voces sao show mesmo.
Gostei do Vraptor trabalho em uma empresa de software que é a maior do sul do brasil no ramo textil. estamos estudando novas tecnologias e levarei o Vraptor para a reuniao.
Valeu galera