ByteArrayDownload com VRaptor

8 respostas
D

Olá pessoal, ontem precisei fazer um download de arquivo, no VRaptor isso é bem simples, como o arquivo que eu tinha estava salvo no banco como byte[] eu tinha duas opções transformar o meu array de bytes em File ou InputStream.

Como eu não quereia fazer nenhum dos dois, e sei que tem a possibilidade de mandar diretamente o byte[] para download num OutputStream, então eu criei essa classe utilitária implementando Download:
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;

import br.com.caelum.vraptor.interceptor.download.Download;

public class ByteArrayDownload implements Download {

	private final byte[] byteArray;
	private final String contentType;
	private final String fileName;
	private final boolean doDownload;
	private final long size;
	
	public ByteArrayDownload(byte[] byteArray, String contentType){
		this(byteArray, contentType, null, false, 0);
	}
	
	public ByteArrayDownload(byte[] byteArray, String contentType, boolean doDownload){
		this(byteArray, contentType, null, doDownload, 0);
	}
	
	public ByteArrayDownload(byte[] byteArray, String contentType, String fileName, boolean doDownload, long size) {
		super();
		this.byteArray = byteArray;
		this.contentType = contentType;
		this.fileName = fileName;
		this.doDownload = doDownload;
		this.size = size;
	}

	@Override
	public void write(HttpServletResponse response) throws IOException {
		writeDetails(response);

		OutputStream out = response.getOutputStream();
		IOUtils.write(byteArray, out);
	}
	
	void writeDetails(HttpServletResponse response) {
		if(fileName != null){
			String contentDisposition = String.format("%s; filename=%s", doDownload ? "attachment" : "inline", fileName);
			response.setHeader("Content-disposition", contentDisposition);
		}
		if (contentType != null) {
			response.setHeader("Content-type", contentType);
		}
		if (size > 0) {
			response.setHeader("Content-Length", Long.toString(size));
		}
	}

}

Ela é quase uma cópia da classe InputStreamDownload, que esta no core do VRaptor.
Espero que sirva pra alguém, porque pra mim já me ajudou em pelo menos duas situações.

8 Respostas

D

Modo de usar:

@Get
	@Path("/galeria-foto/{galeriaFotos.id}")
	public Download foto(GaleriaFotos galeriaFotos) {
		GaleriaFotos ft = galeria.obterFoto(galeriaFotos.getId());
		return new ByteArrayDownload(ft.getFoto(), ft.getExtensaoFoto());
	}

Simples não! :oops:

G

davisnog, o Vraptor já tem componente para isso, basta você usar o DownloadInputStream assim:

byte[] content = ...; ByteArrayInputStream in = new ByteArrayInputStream(content); return new InputStreamDownload(in, contentType, filename);

D

ah é, e eu achando que não tinha essa possibilidade.

O que não é a falta de conhecimento, acabamos reinventando a roda, kkkkkkkkkkkkkkkkkkkk;

Aprendi mais uma, show de bola.

Valeu garcia-jj

Lucas_Cavalcanti

De qqer forma, se quiser incluir essa classe no VRaptor, a gente pode fazer algo como:

public byte[] download(...) {...}

fazer o download automaticamente.

Sabe usar o git, davisnog?
forka o VRaptor lah no github:

D

Não sei Lucas, eu até cheguei a baixar os fontes do VRaptor ontem, mais eu ainda não tive tempo de aprender a mexer com o git nem mesmo ir mais a fundo nos fontes, no dia-a-dia uso o SVN.

G

davisnog, é relativamente simples. Para fazer um fork basta você apertar no botão “Fork” no Vraptor em github.com/caelum/vraptor.

Depois basta baixar o projeto para sua máquina usando o comando git clone xxx, sendo xxx o endereço que o github fornecer para teu fork. O meu é [email removido]:garcia-jj/vraptor.git.

O pessoal do Hibernate andou migrando para o github, e publicara umas dicas boas sobre git: http://planet.jboss.org/post/hibernate_moves_to_git_git_tips_and_tricks

Lucas_Cavalcanti

tem um post bem legal onde vc pode começar:
http://vidageek.net/2009/07/06/git-workflow/

D

blz pelas dicas, chegando em casa, eu vou agilizar isso, estou no trabalho e no entanto não vou poder mexer nos fontes agora.

Criado 20 de outubro de 2010
Ultima resposta 20 de out. de 2010
Respostas 8
Participantes 3