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<String, List><BlobKey>> blobs = blobstoreService.getUploads(request);
BlobKey blobKey = blobs.get("imagem1").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.
<form action="<%= blobstoreService.createUploadUrl("/index/upload") %>" method="post" enctype="multipart/form-data">
<input type="file" name="imagem1" />
<input type="submit"/>
</form>
Se eu substituir o conteúdo do meu método por isso:
Map<String, List><BlobKey>> blobs = blobstoreService.getUploads(request);
BlobKey blobKey = blobs.get("imagem1").get(0);
result.redirectTo("/servletUpload?key="+blobKey.getKeyString());
Onde servletUpload é um servlet comum, e dentro desse servlet eu fazer isso:
BlobstoreServiceFactory.getBlobstoreService().serve(new BlobKey(req.getParameter("key")), 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…