(Resolvido) Upload com Vraptor

53 respostas
F
Galera olha este metodo.
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);
            }
A parte que tem o [code] IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino)); [quote] Nao compila o erro aparece no coptLarge. Alguem ai sabe onde estou errando?

53 Respostas

F

Galera era o import, peguei o da pasta do Vraptor e funcionou
Obrigado

F

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?

L

você precisa de um import estático em org.hamcrest.Matchers.* pra esse código funcionar

F

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
L

vc tá com o jar do hamcrest no WEB-INF/lib?

F

Eu uso o netbeans e nele nao tem a pasta lib no WEB_INF
eu so adiciono o jar em bibliotecas e boa

F

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

L

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

L

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)

F

Lucas Cavalcanti:
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

L

eu não criei, mas sou um dos desenvolvedores :wink:

F

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

F

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>
W

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

F

[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?

W
Cara, fiz algo do tipo sim. mas agora de cabeça, baboo... vou lhe mandar um quebra galho...
@Post @Path("/produtos")
	public void adiciona(Produto produto) {

		dao.adiciona(produto);
		result.redirectTo(ProdutosController.class).lista();
	}
assim ele vai te redirecionar para o metodo lista certo.... ai vc define uma imagem default, do tipo NO IMAGEM, e cria um link para alterar a imagem tipo isso.
<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();
	}
no meu caso eu redirecionei para lista novamente. mas vc pode redirecionar para adicionar um novo produto... tipo:
result.redirectTo(ProdutosController.class).adiciona();

nao é o mais usual para o cliente, mas na pressa... já ajuda... :)

F

é 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

F

tentei e nao conseguir rsssss

F

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!

L

tira o $ do @Path:

@Get @Path("/admin/{produto.id}/editafoto")
F

Lucas Cavalcanti:
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

L

vc precisa incluir um produto no result, pra poder usar ${produto.id} no jsp pra gerar a url

W

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);
	}
F

Desculpa minha ignorância mais como eu faço isso?
Obrigado

L

assim como o well falou :wink:

F

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());


}
L

sim, mas no método edita vc precisa fazer um:

result.include("produto", produto);

//ou

return produto;
F
Lucas Cavalcanti:
sim, mas no método edita vc precisa fazer um:
result.include("produto", produto);

//ou

return produto;
O Metodo edita na produtocontroller certo? segue o metodo:
@Get @Path("/admin/{id}")
    public Produto edita(Long id) {
        return dao.carrega(id);
        
}

Onde eu colocaria este codigo que vc me passou?
Obrigado

L

bom, isso já deveria funcionar então… a menos que o dao.carrega(id); esteja retornando null

F

Olha meu Dao

public Produto carrega(Long id) {
        return (Produto) this.session.load(Produto.class, id);
}

ele esta retornando o produto nao?

L

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?

F

Lucas Cavalcanti:
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

L

posta aqui a lógica editafoto()

F

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?

L

tudo bem… mas cadê o editafoto do ProdutoController?

F

Ele so esta assim

@Get @Path("/admin/{produto.id}/editafoto")
            public void editafoto() {

        }
L

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());
F

Lucas Cavalcanti:
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: {}
L

não é pra receber o produto no construtor, e sim no método.

F

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();
}
L

o formulário está como multipart-form-data? o uploadedFile está vindo preenchido? vc está copiando o getFile para um arquivo nessa pasta?

F

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);
            }
        }
L

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”

F

Lucas Cavalcanti:
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!!!

L

pode gravar com a extensão que vc quiser… só cuidado na hora de abrir :wink:

F

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?

L

bom, se essa lógica retorna um File ou InputStream ou Download da imagem, sim :wink:

F

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

L

tenta copiar a url que cai nessa lógica direto no browser. Aparece a imagem?

a imagem do id passado existe na pasta?

F

Lucas Cavalcanti:
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

F

mais no netbeans eu so coloco o caminho como imagens

F

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!

F

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

Criado 24 de junho de 2011
Ultima resposta 25 de jun. de 2011
Respostas 53
Participantes 3