Arquivo jpg está ficando desfigurado

Boa tarde a todos,

Estou fazendo um select de uma imagem no SQL Server, porém quando eu crio um arquivo a partir do valor retornado, a imagem fica desfigurada.

Alguém sabe me dizer como eu faço para solucionar o problema?

O tipo de dado da imagem no SQLServer está como text.

Eis a imagem gerada apartir do resultado:

Meu código:


import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;

public class Main {

	public static void main(String[] args) throws SQLException, IOException {
		
		Thread thread = new Thread(new Runnable() {
			
			@Override
			public void run() {
				try {
					//String sql = "select cpros, figjpgs from SIGCDPRO where cpros between '010000.03591' and '010050.03603'";
					String sql = "select cpros, figjpgs from SIGCDPRO where cpros = '010050.03603'";
					ConectaBanco conectaBanco = new ConectaBanco();
					Connection conn = conectaBanco.getConexao();
					PreparedStatement ps = conn.prepareStatement(sql);
					ResultSet rs = ps.executeQuery();
					
					while (rs.next()) {
						String figjpgsStr = rs.getString("figjpgs");
						String cpros = rs.getString("cpros").trim();
										
						//funciona, porem mantem a imagem desfigurada(String)
						writeToFile(cpros, figjpgsStr);
						
						//funciona, porem deixa a imagem desfigurada (bytes [])
						//createFileOnRoot(cpros, decodeImage(figjpgsStr));						
					}
					
					rs.close();
					ps.close();
					conn.close();
	
					JOptionPane.showMessageDialog(null, "Fim do processo de transporte.");
					
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		
		thread.start();
	}
	
	private static void writeToFile(String cpros, String content) {
		File file = new File("imgs/" + cpros + ".jpg");
	    BufferedWriter bw = null;
	    
	    try {
	        bw = new BufferedWriter(new FileWriter(file));
	        bw.write(content);
	        bw.flush();
	        bw.close();
	        
	    } catch(IOException e) {
	       e.printStackTrace();
	       
	    } finally {   
	        if(bw != null) {
	            try {
					bw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
	        }
	    }
	}
	
}

Não use Strings para representar dados binários. Strings são sujeitas a conversões de encoding.

Use byte[] e campos BLOB.

Quanto as imagens que já estão no banco, provavelmente já estão destruídas e vc terá que recadastra-las. Espero que não tenha guardado lá num sistema de produção.

ViniGodoy

Vou usar byte [] ou Blob.

Agora com relação as imagens que já estão cadastradas no banco, ‘impossível’ recadastra-las, visto que já existe um sistema em produção usando essas imagens, o sistema que utiliza as imagens foi desenvolvido na linguagem Visual Fox Pro, onde existe uma função chamada strToFile, o programador me disse que ele faz o select e depois simplesmente chama esse método passando o retorno do select e o arquivo de imagem é gerado sem nenhum problema.

Tente usar o getBytes() e gravar o resultado no arquivo. Provavelmente já funcione. Se não funcionar, talvez seja necessário criar uma String com o resultado, usando como segundo parâmetro do construtor o encoding usado do lado do foxpro.

Será que existe alguma maneira de descobrir o encoding a partir da String retornada pelo select?
Os caras do visual fox pro usam uma função chamada FileToStr para converter o arquivo em String, só que esse método não recebe nenhum parâmetro além do arquivo de imagem, olhei na documentação mas por enquanto não encontrei nenhuma informação relacionada ao encoding usado na função ou um encoding padrão.

Grato.