segunda-feira, 15 de maio de 2017



Um problema que me deparei ,foi enviar os dados do meu programa desenvolvido em radstudio para um servidor através que uma pagina php.

Depois de resolver o primeiro problema ,surgiu outro enviar uma imagem e ainda enviar os dados redigidos em formato utf8.

Depois de muito pesquisar na internet consegui resolver esta situação que deve ser um problema para vários programadores.

Deixo aqui um pequeno exemplo .


//  Rad Studio (Delphi)

procedure TFrmPrincipal.enviardados_servidor;
var
 Response      : String;
 params        : TIdMultipartFormDataStream;
 assinatura    : string;
 sqlinsert     : string;

 begin
 
   // Aqui estou a abrir a minha base de dados Sqlite ;

   qryFrente.SQL.Clear;
   qryFrente.SQL.Add('select * from tabela where id="'+id.Text+'"');
   qryFrente.Open();



   //criando os parametros
   params := TIdMultiPartFormDataStream.Create;

 // nesta função vou buscar o nome da imagem que tenho na base de dados ,que foi guardada posteriormente , no directório respectivo.

  {$IFDEF ANDROID}
     assinatura := TPath.Combine( Tpath.GetDocumentsPath,qryFrente.FieldByName('assinatura').Text);
  {$ENDIF}

  {$IFDEF IOS}
     assinatura := GetHomePath+ PathDelim +'Documents'+PathDelim+qryFrente.FieldByName('assinatura').Text';
  {$ENDIF}

  {$IFDEF MSWINDOWS}
     assinatura := 'C:\....\imagens \'+qryFrente.FieldByName('assinatura').Text;
  {$ENDIF};

  // aqui abro outra tabela de dados e crio um insert
   qryFrente.SQL.Clear;
   qryFrente.SQL.Add('select * from verificacoes  where id="'+idText+'"');
   qryFrente.Open();

   // vou atribuir o campo nome ao sqlinsert apenas para exemplo, para não ficar muito comprida a string de envio,

    sqlinsert:=  qryFrente.FieldByName('nome').Text';

  // Desta forma os dados serão enviados em utf8
   params.AddFormField('nome', UTF8Encode(sqlinsert),'utf-8').ContentTransfer := '8bit';

   params.AddFormField('titulo', titulo.text);

  //Aqui envio o ficheiro imagem que esta no directorio definido
   params.AddFile('assinatura', assinatura, 'image/jpg');


 // configuração do header

   IdHTTP1.Request.CustomHeaders.Clear;
   IdHTTP1.Request.Clear;
   IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
   IdHTTP1.Request.ContentEncoding := 'multipart/form-data';

// enviar para o php
   Response := IdHTTP1.Post('http://localhost/gravadados.php',params);

 
   if Response='OK' then
    begin
      showmessage('Gravação concluida !');
    end
   else
    begin
      showmessage('Ocorreu um erro !');
    end;


 // PHP gravadados.php

<?php

//ligação a base de dados (já esta descontinuada, deve utilizar outro tipo de ligação ,mas para o exemplo serve

$connection = mysql_connect(base64_decode($dbhost),base64_decode($user),base64_decode( $pw)) or
   die("Could not connect (1): " . mysql_error());
mysql_select_db($dbname) or die("Could not select database");
   
// crio um valor unico para essa imagem (opcional)
$adata   = date( "YmdHis");

$directorio='imagens/';

$ext=substr($_FILES["assinatura"]["name"], -4); // vou buscar a extenção

// Movo a imagem para o directório definido
                     
move_uploaded_file($_FILES["assinatura"]["tmp_name"], $directorio."/imagem_". $adata.$ext);

// inserir na base de dados (mysql descontinuado)
$sql="insert into tabela(nome,assinatura) VALUES
     ('".$_POST[nome']."',"','$assinatura','"."')" ;  
mysql_query($sql);

echo 'OK;
?>


Espero que o exemplo ajude.