PDA

Ver la Versión Completa : Envio de Foto a API PHP


jrojasmcfia
05-11-2018, 23:57:33
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

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, 09: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, 15: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, 16: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, 19: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.

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, 20:05:21
No olvides usar las etiquetas cuando pongas código.

http://tinyurl.com/bvzsyhb

jrojasmcfia
13-11-2018, 00: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?



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




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

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

dec
13-11-2018, 12:24:09
Hola a todos,

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?



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




$fecha = $_POST['fecha'];
$cantidad = $_POST['cantidad'];
$imagen_temporal = $_FILES['archivo']['tmp_name'];
$tipo = $_FILES['archivo']['type'];
$fp = fopen($imagen_temporal, 'r+b');
$data = fread($fp, filesize($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 (https://stackoverflow.com/a/21429652) que pudiera darse.

jrojasmcfia
14-11-2018, 15: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.



$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')";