Upload de imagens com VRaptor

40 respostas
W

Pessoal to fazendo o ex. da caelum da apostila fj28, mas estou com problemas, vi em outros topicos mas nao consigo resolver o problema, não consigo fazer o upload da imagem, da o seguinte erro:

GRAVE: Servlet.service() for servlet default threw exception br.com.caelum.vraptor.InterceptionException: java.lang.IllegalArgumentException: java.io.FileNotFoundException: C:\Users\Rafael\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\goodbuy\WEB-INF\img\10.imagem (O sistema não pode encontrar o arquivo especificado)

sei que o erro já diz tudo mas nao consigo resolver.

package br.com.caelum.goodbuy.controller;

import java.io.File;

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.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.*;

import static br.com.caelum.vraptor.view.Results.*;

@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("/produtos/{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("imagem"),
							"imagem", "nao.eh.imagem");
				}
			}
		});
		validator.onErrorUse(logic()).redirectTo(ProdutosController.class)
				.edita(produto.getId());

		imagens.Salva(imagem, produto);
		result.redirectTo(ProdutosController.class).edita(produto.getId());
	}

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

import java.io.File;
import java.io.FileOutputStream;

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;

	public Imagens(ServletContext context) {
		String caminhoImagens = context.getRealPath("/WEB-INF/img");
		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 (Exception e) {
			throw new RuntimeException("Erro ao copiar imagem", e);
		}
	}

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

}

Desde já agradeço a ajuda…

40 Respostas

L

tenta, ao invés de salvar dentro de WEB-INF/img, salvar em alguma pasta física do sistema, tipo: C:\Imagens

W

Já tentei, da o mesmo erro…

Caused by: java.lang.IllegalArgumentException: java.io.FileNotFoundException: C:\Users\Rafael\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\goodbuy\D:\img\6.imagem (A sintaxe do nome do arquivo, do nome do diretório ou do rótulo do volume está incorreta)
L

faz assim:

pastaImagem = new File("C:\Imagens");

ou seja, sem o context.getRealPath()

G

Hmm, qual a versão do vraptor que você está usando?

W

estou usando a ultima versão… mais agora o problema não é mas o endereço, se eu colocar a imagem na pasta, esta sendo exibida na aplicação, porem ainda não consigo fazer o upload… vou mexer em mais alguma coisa aki e posto o resultado se positivo ou nao…

Vlw…

G

Hmm, desconfio de uma coisa. Você está usando em qual sistema operacional o site, e em qual sistema operacional você acessa o site?

W

Windows 7… :frowning:

G

Hmm, na documentação do infame commons-io não diz se o método FileUtils.copyLarge cria o arquivo caso ele não existir.

Use o mesmo código que você postou lá no inicio da classe Imagens, porém adicione a linha abaixo logo após a declaração de File destino.

destino.createNewFile()
W

Mesmo com a boa vontade de vcs me ajudarem…

Ainda nao teve jeito, eu estou burrando em algun lugar… quando eu coloco a imagem na pasta mostra normal, mas o upload nao faz de jeito maneira… Qualquer coisa vou tirar a Libs e postar o projeto completo do FJ28…

Vlw

G

Você pode mandar o stacktrace quero saber quem está lançando essa exception.

L

ainda tá dando FileNotFound ou só não tah copiando?

W

Depois que vc falou para eu mudar o caminho, ficou blz, coloquei uma foto lá com o id do produto e e ta exibindo direitinho, mas o upload para a pasta no sistema nao faz nem a pau…

Eu sei que deve ser erro idiota, mas nao consigo enchergar…

da o seguinte erro agora.

HTTP Status 405 -

type Status report

message

description The specified HTTP method is not allowed for the requested resource ().
Apache Tomcat/6.0.26

mas se eu der enter no endereço no browser exibe a foto antiga, mas nao troca pela nova…(não manda para a pasta :frowning: )

Vlw

L

405 quer dizer que vc tah usando o método errado…

sua lógica tá anotada com @Get ou @Post, ou algo do tipo?

W

O controller ta assim

package br.com.caelum.goodbuy.controller;

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

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.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.*;

import static br.com.caelum.vraptor.view.Results.*;

@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("/produtos/{produto.id}/imagem")
	public void upload(Produto produto, final UploadedFile imagem)
			throws IOException {
		validator.checking(new Validations() {
			{
				if (that(imagem, is(notNullValue()), "imagem", "imagem.nula")) {
					that(imagem.getContentType(), startsWith("image"),
							"imagem", "nao.eh.imagem");
				}
			}
		});
		validator.onErrorUse(logic()).redirectTo(ProdutosController.class)
				.edita(produto.getId());

		imagens.Salva(imagem, produto);
		result.redirectTo(ProdutosController.class).edita(produto.getId());
	}

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

e o Imagens está assim

package br.com.caelum.goodbuy.imagens;

import java.io.File;
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;

	public Imagens(ServletContext context) {
		//String caminhoImagens = context.getRealPath("/D:/img");
		pastaImagens = new File("d:/img");
		pastaImagens.mkdir();
	}

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

		try {
			IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));
		} catch (Exception e) {
			throw new RuntimeException("Erro ao copiar imagem", e);
		}
	}

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

}

Esse upload ta dando pano para manga. :frowning:

Obrigado pela atenção …

L

e o form de upload?

W

Opa… ta aki…

<form action="<c:url value="/produtos/${produto.id}/imagem"/>" method="POST" enctype="multpart/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}" />
		
		
		
	</fieldset>	

<fieldset>
	<legend>Upload de imagem</legend>
	<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>
G

Enquanto não tivermos o stacktrace vamos só ficar brincando de adivinhar o problema.

L

no

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

tire o name e o value:

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

:frowning:

L

vc trocou o button?

W

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

L

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

W

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... :(

Quando eu coloco o button assim
<button type="submit">Alterar</button>

da esse erro aki...

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.

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

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

W

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

L

em que linha exatamente tá dando o NullPointerException?

W

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…

L

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

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

W

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…

V

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.

W

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…

V

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

W

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…

L

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?

W

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:

<form action="<c:url value="/produtos/${produto.id}/imagem"/>" method="POST" enctype="multipart/form-data">
	<fieldset>
		<legend>Upload</legend>
			
	<img src="<c:url value="/produtos/${produto.id }/imagem"/>" width="15%" height="15%"></img>
	<input type="file" name="imagem" >
	<button type="submit">Alterar</button>
	
	
	
</fieldset>
</form>

Que tem o seguinte controller:

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

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

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

	}
}

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!

L

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!

L

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!

L

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

L

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.

G

Use um diretório fora da aplicação, exemplo /tmp/imagens

Criado 19 de setembro de 2010
Ultima resposta 1 de nov. de 2013
Respostas 40
Participantes 5