Upload de imagens com VRaptor

vc trocou o button?

troquei agora, mas so da reload na pagina, mas nao altera a imagem… :frowning:

a imagem apareceu na pasta de imagens?

tenta fazer uploads de produtos diferentes e ver se eles pelo menos estão aparecendo…

outra coisa: feche os streams
tanto o imagem.getFile() quanto o FileOutputStream que vc criou precisam ser fechados (.close())

e vc não precisa usar o copyLarge… eles são pra arquivos maiores de 2Gb se eu não me engano

[]'s

Bom essa talvez seja a ultima vez que eu poste nesse topico… pos já estou cansado e cansando principalmente vc’s que estão tentando me ajudar… a situação melhorou mais ainda não se concluiu… vamos lá…

Esta quase tudo funcionando, quando eu deixo o button assim:

<button type="submit" name="_method" value="PUT">Alterar</button>

ele altera os dados do produto mas nao altera a imagem, e redireciona normalmente para a lista de produtos.
se eu coloco na pasta de imagem uma imagem com o id do produto exibe normalmente…

O que mostra que o dowload e o metodo mostra estão ok…

so que se eu cadastro um produto novo e tento colocar uma imagem nao joga para a pasta de jeito algum… :frowning:

Quando eu coloco o button assim

<button type="submit">Alterar</button>

da esse erro aki…

[code]
HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

br.com.caelum.vraptor.InterceptionException: an exception was raised while executing resource method
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:86)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:86)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

root cause

java.lang.NullPointerException
br.com.caelum.goodbuy.imagens.Imagens.salva(Imagens.java:33)
br.com.caelum.goodbuy.controller.ImagensController.upload(ImagensController.java:38)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:86)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.26 logs.[/code]

Eu mudei um pouco a lógica, mais acho que deu no mesmo:

Esse daki é o imagensController

//Tanto faz comentar esse bloco que o resultado é o mesmo... nao esta passando por aki!!!
	@Post
	@Path("/produtos/{produto.id}/imagem")
	public void upload(Produto produto, final UploadedFile imagem) throws IOException{
		
		imagens.upload(imagem, produto);
		result.redirectTo(ProdutosController.class).adiciona(produto);
	}

Esse daki é o imagens

	public void upload(UploadedFile imagem, Produto produto) throws IOException {
		File destino = new File(pastaImagens, produto.getId() + ".jpg");
		destino.createNewFile();

		try {
			IOUtils.copy(imagem.getFile(), new FileOutputStream(new File(
					pastaImagens, produto.getId() + ".jpg")));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			throw new FileNotFoundException("Arquivo não encontrado!");
		} catch (IOException e) {
			e.printStackTrace();
			throw new IOException("Não foi possível enviar o arquivo!");
		}
		
		System.out.println("Teste para saber se passa por aki!!!");
		imagem.getFile().close();
		

	}

E esse daki e o ProdutoController… o altera

//para redirecionar para a lista apos a alteracao, adicionei o /imagem apos o {produto.id}
	@Put @Path("/produtos/{produto.id}/imagem")
	public void altera(Produto produto) {
		dao.altera(produto);
		result.redirectTo(ProdutosController.class).lista();
	}

e por fim o Form Edita…

<form action="<c:url value="/produtos/${produto.id}/imagem"/>" method="Post" enctype="multipart/form-data">
	<fieldset>
		<legend>Editar Produto</legend>
		
		<label for ="nome">Nome:</label>
		<input id="nome" type="text" name="produto.nome" value="${produto.nome}" />
		
		<label for ="descicao">Descricao:</label>
		<textarea id ="descricao" name="produto.descricao">${produto.descricao}</textarea>
		
		<label for ="preco">Preco:</label>
		<input id="preco" type="text" name="produto.preco" value="${produto.preco}" />
		
		
	<img src="<c:url value="/produtos/${produto.id }/imagem"/>" width="100" height="100"></img>
	<input type="file" name="imagem" >
	<button type="submit" name="_method" value="PUT">Alterar</button>
	
</fieldset>
</form>

		

vc tem duas lógicas, uma pro alterar e uma pro upload, certo?

então faça dois formulários diferentes!
um com o PUT no botão (só a parte de alterar), e um sem (só com o upload)

que linha é essa?
br.com.caelum.goodbuy.imagens.Imagens.salva(Imagens.java:33

em vez de imagens.salva imagens.upload… desculpa é que acertei depois…

em que linha exatamente tá dando o NullPointerException?

Essa nullPointer da dando pq tem produto cadastrado sem imagem, ai quando chama o metodo lista… da essa nullpoiter para todos os produtos sem imagem… se eu colocar na pasta uma imagem para cada produto para de dar nullPointer…

não dá pra prevenir isso com um if?

e retornar uma imagem padrão caso não tenha imagem?

Sim Lucas, vou fazer um if sim para acabar com esse NullPointer, fiz um form só para o Upload… eeeeeeeee Funcionou… EEEEEEE :), muito obrigado por não ter desistido da minha causa… Obrigado mesmo… postarei o codigo correto aki depois de acertar umas pequenas coisas… esse codigo pode ajudar mais pessoas, com o upload do Vraptor…

Vlw mesmo, vc é fera…

Revivendo um pouco este tópico!

well, como você fez seu if para verificar quando não se tem imagem?

Pois nos itens que não possuem imagem, aparece uma exception, causada pelo java.io.FileNotFoundException

...\wtpwebapps\vRaptor\WEB-INF\imagens\13.imagem (O sistema não pode encontrar o arquivo especificado)

Já tentei colocar tanto o download, quanto o mostra em um try catch (FileNotFoundException), mas falhei hehe
Como poderia ser feito?

@Get @Path("/produtos/{produto.id}/imagem")
	public File download(Produto produto) {
		return imagens.mostra(produto);
	}

...

public File mostra(Produto produto) {
		return new File(pastaImagens, produto.getId() + ".imagem");
	}

Nenhuma das duas consegui fazer meu catch.

no metodo mostra fica assim:

public File mostra(Produto produto) {

		File file = new File(pastaImagens, produto.getId() + ".jpg");
		return (file.exists()) ? file : new File(pastaImagens + "/default.jpg");

	}

ai na pasta onde ficam salvas as imagens vc coloca uma imagem “default”…

ai vai parar de gerar essa exception…

É isso mesmo well, muito obrigado cara!

Mais uma dúvidazinha, como podemos por no mesmo form? Para já selecionar uma imagem no cadastro de item?

nao consegui fazer isso… somente em forms diferentes… o melhor que fiz foi ao cadastrar os dados ele ja mostrar a tela para adicionar a imagem…

se conseguir fazer no mesmo form me mande como ficou…

Well, tem como vc postar a seu formulário pra darmos uma olhada em como vc fez, se possível, coloque também a classe controller e a imagem completos. Você fez algum comando na Lista para aparecer a imagem nela?

Meu amigo! o negocio é o seguinte.

Primeiramente eu cadastrava o produto, e depois clicava no produto e adicionava uma imagem para ele.

Para isso foi feito o form edita foto:

[code]<form action="<c:url value="/produtos/${produto.id}/imagem"/>" method=“POST” enctype=“multipart/form-data”>

Upload

<img src="<c:url value="/produtos/${produto.id }/imagem"/>" width="15%" height="15%"></img>
<input type="file" name="imagem" >
<button type="submit">Alterar</button>
[/code]

Que tem o seguinte controller:

[code]package br.com.caelum.goodbuy.controller;

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

import br.com.caelum.goodbuy.dao.ProdutoDAO;
import br.com.caelum.goodbuy.imagens.Imagens;
import br.com.caelum.goodbuy.modelo.Produto;
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.interceptor.multipart.UploadedFile;

@Resource
public class ImagensController {

private final Imagens imagens;
private final Result result;
public ImagensController(Validator validator, Imagens imagens, Result result) {
	this.imagens = imagens;
	this.result = result;
}


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

//Este esta OK
@Get
@Path("/produtos/{produto.id}/imagem")
public File download(Produto produto) {
	return imagens.mostra(produto) ;
}

}[/code]

e a classe Imagens que indica a pasta de acesso das imagens etc.

[code]package br.com.caelum.goodbuy.imagens;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.servlet.ServletContext;

import org.apache.commons.io.IOUtils;

import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
import br.com.caelum.vraptor.ioc.Component;

@Component
public class Imagens {

private File pastaImagens;

// este está OK!!!
public Imagens(ServletContext context) {
	 String pastaImagens = context.getRealPath("/WEB-INF/imagens");
	//pastaImagens = new File("/WEB-INF/imagens");
	//pastaImagens.mkdir();
}

public void upload(UploadedFile imagem, Produto produto) throws IOException {
	File destino = new File(pastaImagens, produto.getId() + ".jpg");
	destino.createNewFile();

	try {
		IOUtils.copy(imagem.getFile(), new FileOutputStream(new File(
				pastaImagens, produto.getId() + ".jpg")));
	} catch (FileNotFoundException e) {
		e.printStackTrace();
		throw new FileNotFoundException("Arquivo não encontrado!");
	} catch (IOException e) {
		e.printStackTrace();
		throw new IOException("Não foi possível enviar o arquivo!");
	}

	System.out.println("Teste para saber se passa por aki!!!");
	imagem.getFile().close();

}

// este metodo está OK!!!
public File mostra(Produto produto) {

	File file = new File(pastaImagens, produto.getId() + ".jpg");
	return (file.exists()) ? file : new File(pastaImagens + "/default.jpg");

}

}
[/code]

Mais da uma lida no tópico todo que vc ira achar a resposta… pois eu fui o mais chato do forum até por isso para funcionar… abraço e boa sorte!

EU havia lido todas as postagem, mais mesmo alterando algumas coisa, ainda assim não tinha conseguido fazer o upload das fotos, mais verei como você fez e logo tentarei fazer. Obrigado!

Bom dia Well!
Ainda estou perdido nesta parte de upload de imagens, mesmo conferindo seus códigos, não consegui. Você colocou alguma coisa no formulário e na lista? Como você fez para conectar estes dois ao formulário de upload da imagem? Tem como postar o seu formulário e sua lista para ver onde errei?

Obrigado!

Leonardo, já chegou a olhar a documentação do VRaptor?
http://vraptor.caelum.com.br/pt/docs/download-e-upload/

Ou a apostila?

Ou o livro?
http://www.casadocodigo.com.br/products/livro-vraptor

Apenas li e a apostila e por ela não estou conseguindo fazer a parte de upload da imagem, é provável que falte alguma coisa nela, já que fiz algumas pesquisas pela internet e diversas pessoas estão com o mesmo problema.