Outra maneira de gravar e recuperar imagens no MySQL

7 respostas
brunorota

Ola galera
Existe outra maneira de gravar imagem no banco MySQL?

Eu conheço esse e funciona direitinho

public void addImagemComponente(int cod, File image, FileInputStream fis){
		
		String sql = "INSERT INTO imagemComponente VALUES(?,?)";
		
		try{
			Connection conn = ConnectionDB.getConnection();
			PreparedStatement pstm = (PreparedStatement) conn.prepareStatement(sql);
		
			pstm.setInt(1, cod);
			pstm.setBinaryStream(2, fis, (int) image.length());
			
			pstm.execute();
		}catch(Exception e){
			e.printStackTrace();
		}
	}

O problema desse jeito é q pra eu gravar a imagem "diminuida" no banco eu preciso gravar essa copia da imagem no disco rígido e depois pegar o endereço dessa nova imagem e criar um objeto File

E para recuperar tem a mesma historia precisa gravar no HD e depois recuperar a imagem

conheço essa maneira

public BufferedImage capturaImagem(int cod) throws IOException{
		
		File image = null;
		Blob blob = null;
		InputStream bin = null;
		FileOutputStream bout = null;
		byte[] bbuf = new byte[1024];
		int bytesRead = 0;
		
		String sql = "SELECT imagem FROM imagemComponente WHERE codComponente = "+ cod;
		
		try{
			Connection conn = ConnectionDB.getConnection();
			Statement stm = conn.createStatement();
			ResultSet rset = stm.executeQuery(sql);
			
			while(rset.next()){
				
				blob = rset.getBlob("imagem");  
				bin = blob.getBinaryStream();  
				bout = new FileOutputStream("teste.jpg");  
				
				while ((bytesRead = bin.read(bbuf)) != -1) {  
				     bout.write(bbuf, 0, bytesRead);  
				} 
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}
		
		image = new File("teste.jpg");
		
		BufferedImage bi = ImageIO.read(image);
		
		return bi;
		
	}

Como da pra ver no código acima eu retiro a imagem do banco e gravo no HD e soh depois eu crio um BufferedImage com a imagem retirada do banco, existe uma maneira de eu ter um BufferedImage da imagem retirada do banco mas sem gravar esse imagem na HD?

Atenciosamente

7 Respostas

T

Declare seu método para receber uma InputStream (não FileInputStream).
Passe um ByteArrayInputStream para seu método.
Um ByteArrayInputStream pode ser construído a partir de um byte[].

ViniGodoy

Pq vc não está usando o ImageIO.read, como te recomendei no outro tópico?

brunorota

Ola viny
Agora eu achei o material

O ImageIO.read() aceita um InputStream por parametro, sendo assim creio eu q eu nao vou precisar gravar a imagem e depois ler ela por um File

EU nao estou com o meu note, mais assim q chegar em casa vou testar

Obrigado ^^

brunorota

ola vini consegui retirar as imagens do banco sem precisar gravar no HD com o ImageIO.read() passando um InputStream por parametro

Tem como eu “converter” uma BufferedImage para um InputStream? sem gravar a imagem no HD?

Obrigado

ViniGodoy

ImageIO.write?

brunorota

Eu fiz isso vini pra converter um BufferedImage em um InputStream

//imagem é um BufferedImage
byte[] raster = ((DataBufferByte)imagem.getRaster().getDataBuffer()).getData();  
			 
			 ByteArrayInputStream b = new ByteArrayInputStream(raster);
			 InputStream i = b;

Ele converte soh q ae pra adiciona no banco eu fiz assim

//imagem é um InputStream
setBinaryStream(1, imagem);

o dado é adicionado no banco soh q nao é uma imagem

Oq eu passo pra tranformar ele em uma imagem?

brunorota

Com o ImageIO.write eu consigo gravar os dados no banco vini?

Eh q eu pesquisei e tudo, e nao achei outra maneira pra eu gravar uma imagem no banco

Eu soh achei pra passar um InputStream e um File para o setBinaryStream();

O InputStream eu consegui com o exemplo ae de cima

Tem um jeito de gravar a imagem no banco sem ser a partir de um objeto File?

Criado 10 de agosto de 2009
Ultima resposta 17 de ago. de 2009
Respostas 7
Participantes 3