Fórum Gravar caminho da imagem em banco de dados #592981

05/05/2018

0

Olá amigos, tudo em ordem?

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

Deuzenildo Nascimento

Responder

Post mais votado

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:
// 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).

Emerson Nascimento

Emerson Nascimento
Responder

Gostei + 1

Mais Posts

05/05/2018

Emerson Nascimento

Qual o tamanho das imagens (dos arquivos jpeg) que você gravou no banco?
Responder

Gostei + 0

05/05/2018

Deuzenildo Nascimento

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.
Responder

Gostei + 0

07/05/2018

Deuzenildo Nascimento

Mais alguma idea?
Responder

Gostei + 0

10/05/2018

Deuzenildo Nascimento

Alguma ideia?
Responder

Gostei + 0

14/05/2018

Deuzenildo Nascimento

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.
Responder

Gostei + 0

14/05/2018

Raimundo Pereira


Suatabele.fielbyname('CaminhoIMG').asstring:=timage1.filename;
Responder

Gostei + 0

15/05/2018

Deuzenildo Nascimento

olá P2, da esse erro:
[dcc32 Error] Unit1.pas(52): E2003 Undeclared identifier: 'filename'
Responder

Gostei + 0

15/05/2018

Deuzenildo Nascimento

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.
Responder

Gostei + 0

16/05/2018

Raimundo Pereira

Bom dia.
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;
Responder

Gostei + 1

16/05/2018

Raimundo Pereira

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;



Responder

Gostei + 1

16/05/2018

Raimundo Pereira

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;
Responder

Gostei + 0

01/06/2018

Deuzenildo Nascimento

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..
Responder

Gostei + 0

01/06/2018

Raimundo Pereira

Chama no Skype
sac@p2tecnico.com.br
Responder

Gostei + 0

04/06/2018

Jerson Boer

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
Responder

Gostei + 0

04/06/2018

Deuzenildo Nascimento

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...
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar