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
