Gravar caminho da imagem em banco de dados
Olá amigos, tudo em ordem?
Pessoal, vejam meu cod:
Esse código salva uma imagem jpeg no banco, porem, eu testei 4 imagens e o banco deu salto no tamanho de 300k pra quase 5MB. ou seja, se continuar salvando imagens nele, logo chega a 1GB, o que é inviável.
Eu ja vi por aqui no fórum, mas não consegui implementar, um esquema que faça: trocar o nome da imagem, salva-la em um diretório especifico e salvar só o caminho dela, assim toda vez que buscar a imagem, ele puxe ela pelo caminho, assim o banco fica leve. (ou se for muito complicado tudo isso, dede que salve só o caminho da imagem, já está de bom tamanho).
Então, se alguém por aqui puder me dar umas dicas, vou ficar muito agradecido, só falta isso pra eu concluir meu projetinho.
Abraços a todos.
Pessoal, vejam meu cod:
procedure TForm1.fotoClick(Sender: TObject); var jpg : tjpegimage; begin if OpenPictureDialog1.Execute then jpg := tjpegimage.Create; jpg.LoadFromFile(OpenPictureDialog1.FileName); clipboard.Assign(jpg); foto.pastefromclipboard; jpg.Free; end;
Esse código salva uma imagem jpeg no banco, porem, eu testei 4 imagens e o banco deu salto no tamanho de 300k pra quase 5MB. ou seja, se continuar salvando imagens nele, logo chega a 1GB, o que é inviável.
Eu ja vi por aqui no fórum, mas não consegui implementar, um esquema que faça: trocar o nome da imagem, salva-la em um diretório especifico e salvar só o caminho dela, assim toda vez que buscar a imagem, ele puxe ela pelo caminho, assim o banco fica leve. (ou se for muito complicado tudo isso, dede que salve só o caminho da imagem, já está de bom tamanho).
Então, se alguém por aqui puder me dar umas dicas, vou ficar muito agradecido, só falta isso pra eu concluir meu projetinho.
Abraços a todos.
Deuzenildo Nascimento
Curtidas 0
Melhor post
Emerson Nascimento
14/05/2018
quando o usuário confirmar a gravação do registro, copie a imagem para uma pasta abaixo de onde está sendo executado o programa e grave somente o caminho da pasta recém criada e o nome do arquivo. o nome da pasta pode ser o número do registro do banco de dados.
algo assim:
esta é a idéia.
P.S.: deve ter algum erro de sintaxe. fiz direto no fórum (estou sem Delphi no momento).
algo assim:
// obtém o nome do arquivo
strArquivo := ExtractFileName( OpenPictureDialog1.FileName );
// gera o nome da nova pasta, que será criada dentro da pasta do executável
strPasta := IncludeTrailingPathDelimiter( ExtractFilePath( Application.ExeName ) ) + 'IMG' + format('%.8d', [tabela.Recno] );
// compõe o nome do completo do arquivo (pasta + arquivo)
strNovoArquivo := IncludeTrailingPathDelimiter( strPasta ) + strArquivo;
// tenta copiar o arquivo origem para a pasta determinada
if CopyFile( PAnsiChar(OpenPictureDialog1.FileName), PAnsiChar(strNovoArquivo), True ) then
tabela.ArquivoImg.AsString := strNovoArquivo; // se a cópia foi efetivada, grava o caminho no registro
esta é a idéia.
P.S.: deve ter algum erro de sintaxe. fiz direto no fórum (estou sem Delphi no momento).
GOSTEI 1
Mais Respostas
Emerson Nascimento
05/05/2018
Qual o tamanho das imagens (dos arquivos jpeg) que você gravou no banco?
GOSTEI 0
Deuzenildo Nascimento
05/05/2018
As imagens em si tem 300k cada, porem eu não queira gravar imagens do banco, porque o usuário vai salvar imagens muito grande la.
GOSTEI 0
Deuzenildo Nascimento
05/05/2018
Mais alguma idea?
GOSTEI 0
Deuzenildo Nascimento
05/05/2018
Alguma ideia?
GOSTEI 0
Deuzenildo Nascimento
05/05/2018
Olá, obrigado pela resposta, eu consegui copiar a imagem pra outra pasta, ele abre e pede a imagem de origem, e depois um local pra salvar ela, até ai td bem, a dificuldade agora é salvar esse caminho no banco, pra eu buscar o registro ele trazer a imagem referente aquele registro. Vamos falando e chegaremos num consenso.
GOSTEI 0
Raimundo Pereira
05/05/2018
Suatabele.fielbyname('CaminhoIMG').asstring:=timage1.filename;
GOSTEI 0
Deuzenildo Nascimento
05/05/2018
olá P2, da esse erro:
[dcc32 Error] Unit1.pas(52): E2003 Undeclared identifier: 'filename'
[dcc32 Error] Unit1.pas(52): E2003 Undeclared identifier: 'filename'
GOSTEI 0
Deuzenildo Nascimento
05/05/2018
P2, veja o meu cod na integra:
procedure TForm1.Button1Click(Sender: TObject);
var caminho : string;
begin
if OpenPictureDialog1.Execute then
begin
dbedit1.Clear;
caminho := OpenPictureDialog1.FileName;
image1.Picture.LoadFromFile(caminho);
if SavePictureDialog1.Execute then
begin
Image1.Picture.SaveToFile(SavePictureDialog1.FileName);
adotable1.FieldByName('caminhoIM').AsString:=Image1.filename);
end;
end;
end;
// Ele busca uma imagen de um diretorio, salva ela em outro, e a ideia é a salvar o caminho dela no banco, pra toda vez que buscar pelo registro no banco, ele mostre a tal imagem.
procedure TForm1.Button1Click(Sender: TObject);
var caminho : string;
begin
if OpenPictureDialog1.Execute then
begin
dbedit1.Clear;
caminho := OpenPictureDialog1.FileName;
image1.Picture.LoadFromFile(caminho);
if SavePictureDialog1.Execute then
begin
Image1.Picture.SaveToFile(SavePictureDialog1.FileName);
adotable1.FieldByName('caminhoIM').AsString:=Image1.filename);
end;
end;
end;
// Ele busca uma imagen de um diretorio, salva ela em outro, e a ideia é a salvar o caminho dela no banco, pra toda vez que buscar pelo registro no banco, ele mostre a tal imagem.
GOSTEI 0
Raimundo Pereira
05/05/2018
Bom dia.
Antes de tudo adicione em uses >>> jpeg
//Chamando a procedure no clip de um button
//Chamando a procedure no clip de um button
procedure TFP.BTN_SalvarClick(Sender: TObject);
begin
SaveIMG_Table ;
end;
Antes de tudo adicione em uses >>> jpeg
private
{ Private declarations }
// Procedure Responsável de realizar abertura de uma Jpeg e desenhar no form.
Procedure OpenIMGLOCAL;
// Procedure Responsável de realizar cópia e salvar o caminho da cópia no BD.
Procedure SaveIMG_Table;
//Função responsável de realizar a captura da extensão da imagem carregada.
Function Captura_extenssion:string;
public
procedure TFP.OpenIMGLOCAL; begin opd:=TOpenDialog.Create(nil); if opd.Execute then begin Caminho_Origem := opd.FileName; Image1.Picture.LoadFromFile(Caminho_Origem); Image1.Stretch:=true; Image1.Proportional:=true; end;
procedure TFP.SaveIMG_Table;
begin
spd:=TSaveDialog.Create(nil);
if spd.Execute then
begin
Caminho_Destino:=spd.FileName+'.'+Captura_extenssion;
Image1.Picture.SaveToFile(Caminho_Destino);
cdsTemp.open;
cdsTemp.Insert;
cdsTemp.FieldByName('caminhoIM').AsString:=Caminho_Destino;
cdsTemp.Post;
end;
end;
//Chamando a procedure no clip de um button
procedure TFP.BTN_AbrirClick(Sender: TObject); begin OpenIMGLOCAL; end;
//Chamando a procedure no clip de um button
procedure TFP.BTN_SalvarClick(Sender: TObject);
begin
SaveIMG_Table ;
end;
GOSTEI 1
Raimundo Pereira
05/05/2018
var FP: TFP; var Caminho_Origem : string; var Caminho_Destino : string; var opd:TOpenDialog; var spd:TSaveDialog;
Troque
cdsTemp.open;
cdsTemp.Insert;
cdsTemp.FieldByName('caminhoIM').AsString:=Caminho_Destino;
cdsTemp.Post;
Por
adotable1.open;
adotable1.Insert;
adotable1.FieldByName('caminhoIM').AsString:=Caminho_Destino;
adotable1.Post;
GOSTEI 1
Raimundo Pereira
05/05/2018
Faltou a função de captura da extensão.
function TFP.Captura_extenssion: string;
var Caminho_:String;
begin
//
Caminho_ := Caminho_Origem;
Result := Copy(Caminho_ , Pos('.', Caminho_) + 1, Length(Caminho_));
end;GOSTEI 0
Deuzenildo Nascimento
05/05/2018
Amigo P2, eu tentei fazer dessa forma que você sugeriu acima, mas infelizmente não obtive sucesso.. Com base no código que informei, teria alguma forma mais facil pra salvar o caminho no banco?
Agradeço as contribuições..
Agradeço as contribuições..
GOSTEI 0
Raimundo Pereira
05/05/2018
Chama no Skype
sac@p2tecnico.com.br
sac@p2tecnico.com.br
GOSTEI 0
Jerson Boer
05/05/2018
Olá Deuzenildo, não sei se já resolveu esse caso, mas segue algo que sempre utilizo e tem funcionado bem:
Para copiar os arquivos entre as pastas, eu uso a seguinte função, que usa a própria API (uses Winapi.Windows) do Windows:
CopyFile(PChar(ArqOrigem), PChar(ArqDestino), true);
Ao copiar, sempre procuro renomear o arquivo pra algo que dificulte a identificação de sua origem se alguém fizer o acesso direto à pasta, você pode fazer isso com uma junção de valores de data + hora + minuto + segundo + alguma chave de registro que seja única.
Uma outra dica, eu não costumo gravar o caminho todo do local onde este arquivo está, se você for copiar sempre pra uma mesma pasta seria interessante você ter esse endereço do caminho em uma tabela de configuração do sistema, que vai ser carregado sempre que você iniciar o sistema e gravar no registro somente o nome que ele recebeu, pode ser jpeg/bmp/png/rar, etc, qualquer tipo de arquivo e quando você for abrir ou extrair esse arquivo você executa o [Caminhodaconfiguração] + [nomedoarquivo]..
Qual a vantagem no uso da forma descrita? Se você por alguma razão precisar mudar estes arquivos de lugar, criar uma nova pasta em outra estrutura, lascou-se se você fixou o caminho, diferente de mudar somente na configuração você vai ter que fazer um script atualizando todos.
Veja se ficou claro e qualquer coisa retorna
Para copiar os arquivos entre as pastas, eu uso a seguinte função, que usa a própria API (uses Winapi.Windows) do Windows:
CopyFile(PChar(ArqOrigem), PChar(ArqDestino), true);
Ao copiar, sempre procuro renomear o arquivo pra algo que dificulte a identificação de sua origem se alguém fizer o acesso direto à pasta, você pode fazer isso com uma junção de valores de data + hora + minuto + segundo + alguma chave de registro que seja única.
Uma outra dica, eu não costumo gravar o caminho todo do local onde este arquivo está, se você for copiar sempre pra uma mesma pasta seria interessante você ter esse endereço do caminho em uma tabela de configuração do sistema, que vai ser carregado sempre que você iniciar o sistema e gravar no registro somente o nome que ele recebeu, pode ser jpeg/bmp/png/rar, etc, qualquer tipo de arquivo e quando você for abrir ou extrair esse arquivo você executa o [Caminhodaconfiguração] + [nomedoarquivo]..
Qual a vantagem no uso da forma descrita? Se você por alguma razão precisar mudar estes arquivos de lugar, criar uma nova pasta em outra estrutura, lascou-se se você fixou o caminho, diferente de mudar somente na configuração você vai ter que fazer um script atualizando todos.
Veja se ficou claro e qualquer coisa retorna
GOSTEI 0
Deuzenildo Nascimento
05/05/2018
Olá Jerson, obrigado pela contribuição:
eu consegui copiar a imagem para um diretório e com a possibilidade do usuário mudar o nome da imagem, no caso, o nome da imagem será o nome da pessoa, pois é um cadastro de pessoas, mas precisa da foto, pois será usado futuramente, então não precisamos esconder a pasta ou o nome do arquivo, por hora somente uma pessoa vai usar.
Mas vou tentando aqui, o pessoal tem ajudado com as dicas..
Valeu...
eu consegui copiar a imagem para um diretório e com a possibilidade do usuário mudar o nome da imagem, no caso, o nome da imagem será o nome da pessoa, pois é um cadastro de pessoas, mas precisa da foto, pois será usado futuramente, então não precisamos esconder a pasta ou o nome do arquivo, por hora somente uma pessoa vai usar.
Mas vou tentando aqui, o pessoal tem ajudado com as dicas..
Valeu...
GOSTEI 0