Oi pessoal
Estou com problema na manipulação de arquivos blob (java com firebird)
O que estou tentando fazer… bem, estou carregando qualquer tipo de arquivo com o flex, que esta passando para o java um array de bytes, o java esta manipulando esse array de bytes e gravando no banco, porém estou com problema em manipular o arquivo blob e passar para o flex, para o download do usuário.
Vamos a codificação.
partindo da manipulação do array de bytes para fazer o insert no banco.
//recebo o array de bytes
public String inserirAtendimento(############################################################ byte[] bytes, String fileName)
{
//OUTROS CODIGOS FORAM REMOVIDOS QUE NAO SAO IMPORTANTES
try
{
//crio um diretorio temporario com o nome do arquivo
fileName = System.getProperty("java.io.tmpdir") + fileName;
File arquivo = new File(fileName);
FileOutputStream fos = new FileOutputStream(arquivo);
//fis = new FileInputStream(arquivo);
fos.write(bytes);
//bytes2 = bytes;
fos.close();
}
catch(Exception ex)
{
ex.printStackTrace();
throw ex;
}
//--------------------------------------
//TRATO O ARQUIVO QUE FOI PASSADO POR PARAMENTO ARRAY DE BYTES PARA OUTRO ARRAYDEBYTES
//PEGO O ARRAY DE BYTES PASSADO DO FLEX(parametro) E CRIO UM OUTRO ARRAY DE BYTES PARA FAZER O INSERT
// FOI A UNICA FORMA QUE CONSEGUI FAZER O INSERT NO BANCO FIREBIRD EM UM CAMPO BLOB
String teste2 = fileName.replace("\\", "\\\\");
FileInputStream fis = new FileInputStream(teste2);
int counter = 0;
while(fis.read( ) != -1)
counter++;
byte[] b= new byte[counter];
fis.close();
fis = new FileInputStream(teste2);
for(int i = 0;i<counter;i++)
{
b[i] = (byte)fis.read();
}
//-----------------------------------------------------
//FAZ O INSERT DO DADOS
conexao.abreConexao();
PreparedStatement stmt5 = conexao.con.prepareStatement("update MINHA_TABELA set arquivo =? where codigo=?");
stmt5.setBytes(1, b);
stmt5.setInt(2,codigo);
stmt5.executeUpdate();
conexao.fecharConexao();
status ="Gravado!";
conexao.fecharConexao();
}
catch(SQLException exc)
{
exc.printStackTrace();
status = "Erro"+ exc;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return status;
}
Até aqui deu tudo certo.
Agora vem o pepino grosso
Hora de recuperar o arquivo do banco de dados
public List<ArquivoVO> facaDownloadAnexo(Integer codigo)
{
byte[] armazenaAnexo =null;
Blob mapBlob = null;
List<ArquivoVO> resposta = new ArrayList<ArquivoVO>();
try
{
conexao.abreConexao();
Statement stmt = conexao.con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
String query = "SELECT arquivo FROM MINHA_TABELA WHERE codigo ="+ codigo;
resultSet = stmt.executeQuery(query);
while (resultSet.next())
{
//pego o dados do banco e jogo numa variavel
mapBlob = resultSet.getBlob("arquivo");
//pego os bytes da variavel e jogo em um array de bytes
armazenaAnexo = mapBlob.getBytes(1, (int) mapBlob.length());
//armazeno nessa lista que vai ser enviada pro flex.
//ESSA FORMA QUE ESTOU FAZENDO A RECUPERACAO DOS DADOS ESTÁ CORRETA?
//SERA QUE NÃO PRECISO FAZER MAIS ALGUMA CONVERSÃO ?
resposta.add( new ArquivoVO("testeanexo"+codigoAtendimento, armazenaAnexo) );
return resposta;
}
conexao.fecharConexao();
}
catch(SQLException exc)
{
exc.printStackTrace();
status = "Erro"+ exc;
} /*catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
return resposta;
}
No flex não faço nenhuma conversão pego o arquivo direto e faço o download, e o arquivo quando abro está cheio de caracteres parece que faltou alguma conversão o java fazer.
só para complementar segue a classe arquivoVO
public class ArquivoVO {
private String nome;
private byte[] byteArray;
public ArquivoVO(String nome, byte[] byteArray) {
this.nome = nome;
this.byteArray = byteArray;
}
/**
* @return the nome
*/
public String getNome() {
return nome;
}
/**
* @param nome the nome to set
*/
public void setNome(String nome) {
this.nome = nome;
}
/**
* @return the byteArray
*/
public byte[] getByteArray() {
return byteArray;
}
/**
* @param byteArray the byteArray to set
*/
public void setByteArray(byte[] byteArray) {
this.byteArray = byteArray;
}
}