Download de arquivo diretamente de um campo BLOB [DB2]

2 respostas
E

Boa noite a todos,

Como dito no nome do tópico, estou tendo um problema para fazer o download do conteúdo de um campo BLOB no DB2. O Conteúdo dos arquivos foi armazenado codificado na base64, e quando faço o download desses arquivos, tenho sucesso apenas para os arquivos .txt, porém nos .doc, .xls e .pdf, não tenho sucesso na hora de montá-los novamente no arquivo.

o código que estou usando é:

<%@ page import="java.io.*"%>
<%@ page import="com.ibm.misc.*"%>

<%
	String fileName = request.getParameter("fileName");
	String fileType = request.getParameter("fileType");
	String fileContent = b64Decode(request.getParameter("fileContent"));

	response.setContentType(fileType);
	//response.setContentType("application/octet-stream");
	response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
	response.setContentLength((int) fileContent.length());

	try {

		StringBuffer sb = new StringBuffer(fileContent);
		InputStream in = new ByteArrayInputStream(sb.toString().getBytes());
		//InputStream in = new ByteArrayInputStream(sb.toString().getBytes("UTF-8"));
		ServletOutputStream sos = response.getOutputStream();

		byte[] outputByte = new byte[4096];
		//copy binary contect to output stream
		while (in.read(outputByte, 0, 4096) != -1) {
			sos.write(outputByte, 0, 4096);
		}
		in.close();
		sos.flush();
		sos.close();

	} catch (IOException ex) {
		ex.printStackTrace();
	}
%>

<%!public String b64Decode(String msg) {
		BASE64Decoder decoder = new BASE64Decoder();
		byte[] decodedBytes = null;
		try {
			decodedBytes = decoder.decodeBuffer(msg);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return new String(decodedBytes);
	}%>

Obs: Na hora de incluir o arquivo, tentei incluir o conteúdo no campo BLOB de 2 maneiras:

1- Inserindo apenas o conteúdo que recebo na base64
“RW5yaWNvIEJlcmdhbW8=”

2- Recebendo o conteúdo completo do arquivo
“data:text/plain;base64,RW5yaWNvIEJlcmdhbW8=”

alguém teria alguma dica de qual poderia ser o problema?

Muito obrigado,
Enrico Bergamo

2 Respostas

R

Enrico,

Encontrei este link http://www.ibm.com/developerworks/data/library/techarticle/0310bhogal/0310bhogal.html que explica como trabalhar com campos blob no DB, analisando o artigo e vendo o seu código e baseado nas implementações que já fiz com base64/criptografia, vc não pode assumir que seu campo BLOB é texto.
No caso a sua função b64Decode deve retornar um Stream/Array de bytes e não String, pois, no momento da codificação você esta utilizando um arquivo em bytes e convertendo para base64.
Eu não sei exatamente como ficaria a sua função, mas tenho para mim que a classe StringBuffer deverá ser substituída por InputStream talvez.

E

Rubem,

Primeiramente, obrigado pela resposta.

Dei uma lida nesse tópico da IBM, e juntamente com uma resposta que recebi de um amigo, posso ter deixado passar um pequeno em branco:

byte[] outputByte = new byte[4096];  
        //copy binary contect to output stream  
        while (in.read(outputByte, 0, 4096) != -1) {  
            sos.write(outputByte, 0, 4096);  
        }

Eu estou assumindo que o tamanho será de 4096 bytes, porém e se não for? Ai eu deveria copiar apenas os bytes que forem lidos corretamente.

byte[] outputByte = new byte[4096];
 //copy binary contect to output stream
  int byteRead=0
  while (byteRead=in.read(outputByte, 0, 4096) != -1) {
            sos.write(outputByte, 0, byteRead);
  }

Tanto essa solução quanto a que você me deu, só poderei testar na segunda-feira, pois fiz a proeza de deixar meu note no trampo. Assim que testa-las postarei um retorno!

P.S: Novas soluções também são bem vindas (:

Criado 6 de janeiro de 2012
Ultima resposta 7 de jan. de 2012
Respostas 2
Participantes 2