Gravar JPG no mySQL

2 respostas
C

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?

2 Respostas

Rafael_Steil

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

dudaskank

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

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 {
						/*  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) {
			}
		}
	}

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

^__^

Criado 31 de março de 2004
Ultima resposta 4 de abr. de 2004
Respostas 2
Participantes 3