Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   Envio de Foto a API PHP (https://www.clubdelphi.com/foros/showthread.php?t=93545)

jrojasmcfia 06-11-2018 00:57:33

Envio de Foto a API PHP
 
Hola estoy tratando en mi aplicacion Android enviar varios datos a un sitio php para que escriba en una base de datos, para los campos texto ya lo logre sin embargo no he podido pasar una imagen, entendo que esta al pasarse como parametro debe ser un string para lo cual transforme la imagen en un String de la siguiente manera

Código Delphi [-]
stream.LoadFromFile(ruta);
SS:=TStringStream.Create('');
S.CopyFrom(Stream, 0);
y luego indico en un servicio rest lo siguiente
restclient1.BaseURL := 'http://www.mipagina.com/Imagenes/icosecha.php?fecha=' + efecha + '&cantidad=' + FloatToStr(spinbox1.value) + '&imagen=' + SS.DataString;

el URL lo llama bien, sin embargo no se como convertir desde la pagina php el string que le envie de la imagen para que me lo guarde en un campo blob de la base de datos. Alguien que haya tenido el mismo inconveniente

dec 06-11-2018 10:11:09

Hola a todos,

Podrías codificar en Base64 la imagen que quieres enviar, puesto que, ya en PHP, no tendrás problemas en utilizar dicha cadena Base64, guardarla en un archivo, y, a continuación, en una base de datos. Sin embargo, una petición HTTP GET, es decir, usar la URL para enviar una cadena en Base64, puede ser algo problemático, cuando no imposible, debido a los límites que se puedan imponer a los argumentos que pueden enviarse y hasta recibirse usando la URL en una petición HTTP GET.

Lo anterior quiere decir que tal vez deberías usar HTTP POST, y, haciéndolo así, intentar averiguar si puedes ir más allá y enviar, mediante HTTP POST, directamente, el archivo, no su representación en Base64. PHP no tiene problemas en recibir archivos "tal cual", a los que podrás acceder usando la variable "$_FILES" de PHP. Para hacer esto habría que ver si el componente "REST" que usas permite enviar archivos de este modo, pero, en principio, debería poder, o bien podrías sustituirlo por un "IdHttp", que, permite enviar archivos, directamente, sin pasar por Base64.

jrojasmcfia 06-11-2018 16:55:28

Ok, gracias Dec, si he visto algunos post donde usan idhttp, sin embargo me queda la duda de como hago para que el mismo insert que utilizo en la página php para ingresar los otros parámetros (como cantidad y fecha) que ya tengo, reciba e ingrese también la imágen usando el método idhttp.

dec 06-11-2018 17:02:20

Hola a todos,

En principio, no es complicado, es decir, se trata de usar las variables "super globales" de PHP: $_GET, $_POST y $_FILES. Una llamada HTTP POST puede incluir datos de entrada que se encontrarán en la variable $_POST, y, también archivos, que se encontrarán en la variable $_FILES. Piensa en un formulario HTML... que permite enviar varios campos, además de archivos, en una sola llamada HTTP POST.

jrojasmcfia 07-11-2018 20:48:25

Hola Dec, he estado investigado lo que indicas y generè el siguiente código de un post que me encontre en el clubdelphi, sin embargo el URL donde requiero enviar es https, para lo cual utilizo el componente TIdSSLIOHandlerSocketOPenSSL,como lo indico en el código, pero a la hora de correrlo en mi movil me da error "Could not load SSL library", tienes alguna idea.

Código Delphi [-]
procedure TForm3.enviohttp;
var
  https: TIdHttp;
  params: TStrings;
  respuesta: string;
  idssl: TIdSSLIOHandlerSocketOPenSSL;
begin

   https := TIdHTTP.Create(Self);
   idssl := TIdSSLIOHandlerSocketOpenSSl.Create(nil);
   params := TStringList.Create;
  try
    HTTPs.ReadTimeout := 30000;
    IdSSL.SSLOptions.Mode := sslmClient;
    IdSSL.SSLOptions.Method := sslvSSLv23;
    HTTPs.IOHandler :=idssl;

    //IdSSL.SSLOptions.Mode := sslmUnassigned;
    params.Add('variable1=valor1');
    params.Add('variable2=valor2');
    respuesta := https.Post('https://www.mipagina.com/Imagenes/pruebas-post.php', params);
    ShowMessage('Respuesta: ' + respuesta);
  finally
    https.Free;
    params.Free;
  end;
end;

Casimiro Notevi 07-11-2018 21:05:21

No olvides usar las etiquetas cuando pongas código.


jrojasmcfia 13-11-2018 01:42:14

Hola Dec, gracias por los aportes, pero no logro leer el archivo desde la pagina de PHP.
Ya lo logre enviar desde delphi mediante el siguiente codigo, pero no logro desde php escribir el archivo en el cambo blob de la BD, podrias indicarme si algo no va bien?


Código Delphi [-]
  data :=TIdMultiPartFormDataStream.Create();
   try
    data.AddFormField('fecha',efecha);
    data.AddFormField('cantidad',valor);
    data.AddFile('archivo', ruta,'image');
    http.Post('http://www.mipagina.com/Imagenes/icosecha.php',data);
   finally
    data.Free;
   end;

Pero en PHP lo hago de la siguiete manera y cuando escribo la variable en la BD MySql, no escribe nada

Código PHP:



 $fecha 
$_POST['fecha'];
 
$cantidad $_POST['cantidad'];
 
$imagen_temporal $_FILES['archivo']['tmp_name'];
 
$tipo $_FILES['archivo']['type'];
 
$fp fopen($imagen_temporal'r+b');
 
$data fread($fpfilesize($imagen_temporal));
 
fclose($fp);

$query    "INSERT INTO ps_cosecha (Fecha, Cantidad, Imagen,TipoImagen, nregistro) 
             VALUES('
$fecha', '$cantidad', '$Imagen','$tipo',  '$rvalor')"


dec 13-11-2018 13:24:09

Hola a todos,

Cita:

Empezado por jrojasmcfia (Mensaje 529499)
Hola Dec, gracias por los aportes, pero no logro leer el archivo desde la pagina de PHP.
Ya lo logre enviar desde delphi mediante el siguiente codigo, pero no logro desde php escribir el archivo en el cambo blob de la BD, podrias indicarme si algo no va bien?


Código Delphi [-]
  data :=TIdMultiPartFormDataStream.Create();
   try
    data.AddFormField('fecha',efecha);
    data.AddFormField('cantidad',valor);
    data.AddFile('archivo', ruta,'image');
    http.Post('http://www.mipagina.com/Imagenes/icosecha.php',data);
   finally
    data.Free;
   end;

Pero en PHP lo hago de la siguiete manera y cuando escribo la variable en la BD MySql, no escribe nada

Código PHP:



 $fecha 
$_POST['fecha'];
 
$cantidad $_POST['cantidad'];
 
$imagen_temporal $_FILES['archivo']['tmp_name'];
 
$tipo $_FILES['archivo']['type'];
 
$fp fopen($imagen_temporal'r+b');
 
$data fread($fpfilesize($imagen_temporal));
 
fclose($fp);

$query    "INSERT INTO ps_cosecha (Fecha, Cantidad, Imagen,TipoImagen, nregistro) 
             VALUES('
$fecha', '$cantidad', '$Imagen','$tipo',  '$rvalor')"


Yo empezaría por ver si las variables de entrada ($_POST, $_FILES) contienen los datos que se esperan. En todo caso, me aseguraría también de que PHP está configurado para informar de cualquier posible error que pudiera darse.

jrojasmcfia 14-11-2018 16:54:28

Hola

Gracias Dec, revise las variables y use el siguiente código, este si me funciono para hacer el Insert y efectivamente el archivo llega a la BD, que luego se puede desplegar.

Código PHP:


$fecha 
$_POST['fecha'];
$cantidad $_POST['cantidad'];
$binario_nombre_temporal=$_FILES['archivo']['tmp_name'] ;
$binario_contenido addslashes(fread(fopen($binario_nombre_temporal"rb"), filesize($binario_nombre_temporal)));
$binario_tipo=$_FILES['archivo']['type'];

$query    "INSERT INTO ps_cosecha (Fecha, Cantidad, Imagen,TipoImagen, nregistro) 
             VALUES('
$fecha', '$cantidad', '$binario_contenido','$binario_tipo',  '$rvalor')"



La franja horaria es GMT +2. Ahora son las 03:22:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi