[RESOLVIDO] - GAE Download Blobstore + VRaptor

Tive aqui esses dias pedindo ajuda sobre o mesmo assunto, conforme o link abaixo, mais até então era upload.

http://www.guj.com.br/posts/list/221168.java

Agora gostaria de saber como eu faria o download nesse caso, o codigo que eu tenho é o seguinte:

 @Get
	@Path("/acomodacao/galeria-fotos/{acomodacao.id}")
	public void galeriaFotos(Acomodacao acomodacao) throws IOException{
		Acomodacao ac = dao.obter(acomodacao.getId());
		BlobKey blobKey = new BlobKey(ac.getFoto().getKeyString());
		//blostore é uma instancia de BlobstoreService injetado pelo VRaptor
     //response é uma instancia de HttpServletResponse injetado pelo VRaptor
     blobstore.serve(blobKey, response);
	}

A minha duvida é, como vou pegar o arquivo no meu .jsp?

colocando um link pra essa lógica

precisa de uma lógica pra mostrar o jsp e uma pra fazer o download

Lucas, desculpe minha ignorância, mais eu não entendi o que você quiz dizer.

ter duas lógicas, por exemplo:

@Get
@Path("/acomodacao/galeria-fotos")
public void galeriaFotos() {...}

@Get  
@Path("/acomodacao/galeria-fotos/{acomodacao.id}")  
public void fotoAcomodacao(Acomodacao acomodacao) throws IOException{
    // a lógica do blobstore que vc tinha posto, com um result.nothing() no final
}

e na galeriaFotos.jsp vc colocar:

<a href="<c:url value="/acomodacao/galeria-fotos/${acomodacao.id}"/>">Foto da acomodacao ${acomodacao.id}</a>

se for foto mesmo, vc pode trocar o por um

Obrigado Lucas, deu certo.

Esse tópico é meio antigo, mas foi o único com o tema que eu encontrei e acho que é melhor do que criar outro.

Ao tentar utilizar o blobstore.serve(blobKey, response) dentro de um método no meu controller, eu recebo o erro:
Grave: Asked to send blob <BlobKey: iiLoE35cdjb83TPRHti3mQ> but response was already committed.

Isso acontece mesmo eu colocando o result.nothing() no final do método.

	public void upload() throws IOException{
		Map&lt;String, List&gt;&lt;BlobKey&gt;&gt; blobs = blobstoreService.getUploads(request); 
		BlobKey blobKey = blobs.get(&quot;imagem1&quot;).get(0); 
		blobstoreService.serve(blobKey, response);
		result.nothing();
	}

O upload está acontecendo normalmente, o problema é apenas no método serve.

Alguma dica?

quem chama esse método upload? e quando isso é chamado?

Ele é chamado através de um formulário.

&lt;form action="&lt;%= blobstoreService.createUploadUrl("/index/upload") %&gt;&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt; &lt;input type="file" name="imagem1" /&gt; &lt;input type="submit"/&gt; &lt;/form&gt;

Se eu substituir o conteúdo do meu método por isso:

		Map&lt;String, List&gt;&lt;BlobKey&gt;&gt; blobs = blobstoreService.getUploads(request); 
		BlobKey blobKey = blobs.get(&quot;imagem1&quot;).get(0);
		
		result.redirectTo(&quot;/servletUpload?key=&quot;+blobKey.getKeyString());

Onde servletUpload é um servlet comum, e dentro desse servlet eu fazer isso:

               BlobstoreServiceFactory.getBlobstoreService().serve(new BlobKey(req.getParameter(&quot;key&quot;)), resp);

A imagem passa a ser exibida. Mas eu não queria precisar de um servlet, e tambén não entendi ainda qual a razão do erro acontecer.

Edição: Acabei de fazer um teste que me deixou ainda mais confuso. Antes de executar o método serve, eu dei um System.out.println no result.isCommitted() e a resposta foi false.

Edição 2: Removi o jar do objenesis e passou a funcionar. Espero que esse jar não seja necessário em outros lugares.

o objenesis não funciona no GAE mesmo, pode tirar…