Gravar JPG no mySQL

Alguém tem exemplos de rotinas para gravar / ler um arquivo jpg em um campo numa base de dados mySQL? Há alguma desvantagem nesta abordagem?

Grave em um campo do tipo BLOB. Use qualquer classe java que leia e grave arquivos binarios.

Desvantagem? sim… Pq vc nao grava em disco e deixa no banco o nome do arquivo apenas?

Rafael

Esse meu código não é grande coisa, mas funciona…

[code] public void importar(String nome, String arq) {
File f;
FileInputStream fin = null;
InputStream in;
PreparedStatement pst = null;
int r;

	if (!estaConectado()) {
		mensagemErro("Você precisa conectar para realizar esta operação");
		return;
	}

	mensagem("Importando " + nome + " de " + arq + "...");
	try {
		/* Prepara a inserção, observe que a '?' da sql
		 * será trocada pelo InputStream.
		 */
		pst =
			con.prepareStatement(
				"INSERT  INTO "
					+ tabelaBlob
					+ " ("
					+ campoNome
					+ ", "
					+ campoBlob
					+ ") VALUES ('"
					+ nome
					+ "', ?)");

		mensagem("Abrindo arquivo para leitura...");
		/* Abre o arquivo */
		f = new File(arq);
		fin = new FileInputStream(f);
		/* Faz com que a 1ª e única '?' do pst vire o conteúdo
		 * do FileInputStream.
		 */
		pst.setBinaryStream(1, (InputStream) fin, (int) f.length());
		mensagem("Concluindo exportação...");
		/* Executa o update na tabela. */
		r = pst.executeUpdate();
		/* Fecha tudo e mostra mensagem */
		fin.close();
		pst.close();
		mensagem(
			"Importação concluída com sucesso. "
				+ r
				+ " linha inserida na tabela "
				+ tabelaBlob
				+ ".");
	}
	catch (Exception e) {
		mensagemErro(e.getClass() + " - " + e.getMessage());
		e.printStackTrace();
	}
	finally {
		try {
			fin.close();
		}
		catch (Exception e) {
		}
		try {
			pst.close();
		}
		catch (Exception e) {
		}
	}
}

public void exportar(String nome, String arq) {
	File f;
	FileOutputStream fos = null;
	InputStream in;
	Statement st = null;
	ResultSet rs;
	byte buffer[];
	final int bufferSize = 2048;
	int bytesLidos;

	if (!estaConectado()) {
		mensagemErro("Você precisa conectar para realizar esta operação");
		return;
	}

	mensagem("Exportando " + nome + " para " + arq + "...");
	try {
		/* Cria o Statement e executa uma query */
		st = con.createStatement();
		try {
			rs =
				st.executeQuery(
					"SELECT "
						+ campoBlob
						+ " FROM "
						+ tabelaBlob
						+ " WHERE "
						+ campoNome
						+ " = '"
						+ nome
						+ "'");
		}
		catch (SQLException se) {
			/* Se o erro que deu é por causa do tipo de dado incompatível, é bem
			 * possível que o 'campoNome' não aceite estar entre aspas, então
			 * tenta de novo sem elas.
			 */
			if (se.getSQLState().equals("22005")) {
				rs =
					st.executeQuery(
						"SELECT "
							+ campoBlob
							+ " FROM "
							+ tabelaBlob
							+ " WHERE "
							+ campoNome
							+ " = "
							+ nome);
			}
			else {
				throw se;
			}
		}
		mensagem("Abrindo arquivo para gravação...");
		/* Abre o arquivo para escrita */
		f = new File(arq);
		fos = new FileOutputStream(f);
		/* Se a query retornou algum resultado */
		if (rs.next()) {
			/* Pega a stream do objeto desejado */
			in = rs.getBinaryStream(campoBlob);
			/* Se for diferente de nulo */
			if (in != null) {
				/* Cria o buffer */
				buffer = new byte[bufferSize];
				/* Faça... */
				do {
					/* Lê da InputStream */
					bytesLidos = in.read(buffer);
					/* Se leu mais que 0 bytes */
					if (bytesLidos > 0) {
						/* Escreve a quantidade lida no arquivo */
						fos.write(buffer, 0, bytesLidos);
					}
				}
				/* Enquanto os bytesLidos forem maiores
				 * que 0
				 */
				while (bytesLidos > 0);
			}
			else {
				/* Se a InputStream for nula, é um arquivo
				 * vazio
				 */
				mensagem("Arquivo vazio.");
			}
		}
		/* Mostra uma mensagem e fecha tudo */
		mensagem("Concluindo exportação...");
		fos.close();
		st.close();
		mensagem("Exportação concluída com sucesso.");
	}
	catch (Exception e) {
		mensagemErro(e.getClass() + " - " + e.getMessage());
		e.printStackTrace();
	}
	finally {
		try {
			fos.close();
		}
		catch (Exception e) {
		}
		try {
			st.close();
		}
		catch (Exception e) {
		}
	}
}

[/code]

Desvantagem será que seu BD vai crescer mais rápido… mas deve ter vantagens também… :-p

:slight_smile: