[RESOLVIDO]Manipulação de arquivos Java - Firebird - Blob

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;
	}
	
	
}

Não entendi por que você cria um segundo array de bytes modificando o nome do arquivo e substituindo as aspas duplas por aspas biquadradas…

Pois não consigo fazer o insert com o array de bytes que recebo por parâmetro diretamente, preciso criar outro array de bytes.

Basta iniciar o arrayde bytes que resolve
armazenaAnexo = new byte[(int)mapBlob.length()];

pegue sua variável armazenaAnexo e transforme em String assim

new String(armazenaAnexo)

pronto, acredito que vai funcionar