Gravar video, audio no banco - BLOB

10 respostas
J

Estou com o seguinte problema, eu tenho que gravar audio e video em um banco de dados (Firebird),
Eu já deixei os campos no BD como BLOB, eu preciso gravar o arquivo em si e não caminho…

Como que eu faço para gerar um objeto desse meu arquivo? e grava-lo no banco?

Grato.

Att:
Jonatas

10 Respostas

C

Faz um OutputStream do arquivo e lê ele em um array de bytes. Pra gravar no banco é só gravar esse array de bytes.

J

Seria mais ou menos isso? (estou começando no java)

OutputStream objarquivo = new FileOutputStream(“arquivo.avi”);

Grato.

romarcio
Eu tenho esse método feito, fiz para transformar imagem e audio em bytes e salvar no banco. Vê se te ajuda.
/**
     * Converte um arquivo (mp3, jpg, ...) selecionado em um byte[] para ser gravado no banco de dados.
     *
     * @return retorna um array de bytes (byte[])
     */
    public byte[] converter() {
        File file = new File("arquivo.avi");
		
        BufferedInputStream bis = null;
		
		byte[] bFile = new byte[(int) file.length()];

		try {
			bis = new BufferedInputStream(new FileInputStream(file));
			bis.read(bFile);
			return bFile;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (bis != null) {
					bis.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
        }
        return new byte[0];
    }
C

É isso mesmo.

Você deve ter visto que o output tem um método read que grava todos os bytes do arquivo um array de bytes. É só pegar esse array de bytes e gravar no banco depois.

J

Obrigado pelas dicas! Vou tentar fazer isso.

J

Eu estou quase conseguindo, porem agora estou com um problema…

Estou tentando gravar no banco, porem esta dando erro nessa linha:

stm.setBinaryStream(2, video);

a variavel video é do tipo byte - byte [] video

Esse é o metodo converter();

public byte[] converter(String local_arquivo) {

        File file = new File(local_arquivo);

        BufferedInputStream bis = null;

        byte[] bFile = new byte[(int) file.length()];

        try {
            bis = new BufferedInputStream(new FileInputStream(file));
            bis.read(bFile);
            return bFile;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return new byte[0];
    }
romarcio

acho que tem que usar o método: stm.setByte(2, video);

Você está usando firebird né? Tentou fazer como esse exemplo do link? Parece que não precisa usar o método converter() nesse caso.
http://www.firebirdfaq.org/faq372/

J

Na verdade esse projeto é do meu TCC, onde vou testar desempenho de vários bancos, por isso preciso de um metodo que funcione em qualquer banco…
Eu tentei esse que você me disse:

stm.setByte(2, video);

Porem da o seguinte erro:

method setByte in interface PreparedStatement cannot be applied to given types;
required: int, byte
found: int,byte[]
reason: actual argument byte[] cannot be converted to byte by method invocation conversion

romarcio

Tente o setBytes(), esse é que recebe um array por parâmetros.

J

Valeu !!! funcionou !!!

Criado 18 de outubro de 2012
Ultima resposta 21 de out. de 2012
Respostas 10
Participantes 3