FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Subuir un fichero a un servidor
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Subuir un fichero a un servidor
Posted: Sun Nov 26, 2023 11:09 AM
Hola Buenos días y gracias anticipadas por vuestro tiempo
El caso es que estoy intentando subir un fichero pdf a un servidor pero no lo consigo, si lo hago con postman si puedo pero desde harbour no hay manera. No tengo muchos conocimiento de uso de este tipo de comunicación por lo que estoy buscando en el foro como se hace pero no encuentro nada.
Este es el codigo que utilizo:
...
cUrl := "url..."
cFile := "X:\PDFS\FICHERO.PDF"
xDoc := CreateObject( "MSXML2.DOMDocument" )
ohttp := CreateObject( "MSXML2.XMLHTTP" )
ohttp:Open( "POST" , cUrl, .f.)
oHttp:SetRequestHeader("Content-Type" , "multipart/form-data" )
oHttp:SetRequestHeader("file", cFile)
try
ohttp:Send( xJSon )
catch
Msginfo("Error en el envio del fichero)
RETURN NIL
end
cRespuesta := ohttp:responseText
...
Esto es lo que envio desde postman y que funciona
Code (fw): Select all Collapse
curl --location 'https://www.zohoapis.eu/crm/v5/Leads/594992000001640002/Attachments' \
--header 'Authorization: Zoho-oauthtoken 1e...' \
--form 'file=@"/X:/PdfS/ZOHO_PRE.PDF"'

Alguien me puede ayudar.
Gracias de nuevo
Posts: 309
Joined: Wed Mar 28, 2018 04:38 PM
Re: Subuir un fichero a un servidor
Posted: Sun Nov 26, 2023 11:28 AM

Dile a postman que te genere el código en PHP que es muy similar a HB y lo aplicas a HB con curl

Enviado desde mi motorola edge 20 mediante Tapatalk

--------

¿ Y porque no ?

¿ And why not ?
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Re: Subuir un fichero a un servidor
Posted: Mon Nov 27, 2023 06:19 AM
Hola de nuevo y gracias por responder,
He estado intentando aplicar lo que hace postman a mi programa pero no lo consigo, perdón por mi ignorancia
Code (fw): Select all Collapse
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://www.zohoapis.eu/crm/v5/Leads/59499200../Attachments',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => array('file'=> new CURLFILE('/X:/PdfS/ZOHO_PRE.PDF')),
  CURLOPT_HTTPHEADER => array(
    'Authorization: Zoho-oauthtoken 1000.',
    'Cookie: 4993755637=863c018b4f; JSESSIONID=CBD8353B80A; _zcsr_tmp=5900d47b-2864-4c5097; crmcsr=5900d47b341-bf4531d05097'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
La verdad es que no se parece nada al codigo que tengo escrito en harbour

Alguien podría poner un ejemplo de como enviar un fichero.

Gracias de nuevo
Posts: 309
Joined: Wed Mar 28, 2018 04:38 PM
Re: Subuir un fichero a un servidor
Posted: Mon Nov 27, 2023 09:12 AM
Hola.
el código sería como el siguiente:
Code (fw): Select all Collapse
curl_easy_setopt( hcUrl, HB_CURLOPT_URL, 'https://www.zohoapis.eu/crm/v5/Leads/59499200../Attachments')
curl_easy_setopt( hcUrl, HB_CURLOPT_RETURNTRANSFER , .T.)
curl_easy_setopt( hcUrl, HB_CURLOPT_ENCODING , '')
curl_easy_setopt( hcUrl, HB_CURLOPT_MAXREDIRS , 10)
curl_easy_setopt( hcUrl, HB_CURLOPT_TIMEOUT , 0)
curl_easy_setopt( hcUrl, HB_CURLOPT_FOLLOWLOCATION , .t.)
curl_easy_setopt( hcUrl, HB_CURLOPT_HTTP_VERSION , HB_CURL_HTTP_VERSION_1_1)
curl_easy_setopt( hcUrl, HB_CURLOPT_CUSTOMREQUEST , 'POST')
curl_easy_setopt( hcUrl, HB_CURLOPT_HTTPHEADER , {;
                                                        'Authorization: Zoho-oauthtoken 1000.',;
                                                        'Cookie: 4993755637=863c018b4f; JSESSIONID=CBD8353B80A; _zcsr_tmp=5900d47b-2864-4c5097; crmcsr=5900d47b341-bf4531d05097';
}
No lo he probado, solo lo he pasado a formato HB, faltaría las opciones de POSTFIELDS . Puedes verlas en el hbcurl.ch que incluye harbour.

Una vez tienes todas las opciones asignadas, ejecutas el comando con
Code (fw): Select all Collapse
curl_easy_perform(hCurl)
sé que no está el código 100% montado pero espero te de la ayuda suficiente para seguir
--------

¿ Y porque no ?

¿ And why not ?
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Re: Subuir un fichero a un servidor
Posted: Tue Nov 28, 2023 05:21 AM
Si intento usar la funcion
Code (fw): Select all Collapse
hCurl := curl_easy_init()
El programa no se ejectua

Ya he probado todo lo que se me ocurre y nada

Sigo intentando con el codigo que tenia
Code (fw): Select all Collapse
Local xDoc, oHttp, cRespuesta, hHashRes
Local cUrl, cFile, nTam
cUrl := "https://www.zohoapis.eu/crm/v5/Leads/594992000001640002/Attachments" + space(1)
Depura(cUrl)

xDoc  := CreateObject( "MSXML2.DOMDocument" )
ohttp := CreateObject( "MSXML2.XMLHTTP" )
ohttp:Open( "POST" , cUrl, .f.)
oHttp:SetRequestHeader("Authorization", "Zoho-oauthtoken " + cToken)    
oHttp:SetRequestHeader("form-data"    , "file" )
cFile := "X:\PDFS\ZOHO_PRE.PDF"
nTam := FileSize(cFile)
Depura(nTam)
oHttp:SetRequestHeader("Content-Type" , "multipart/form-data;boundary=" + NTRIM(nTam) )
cFile := "X:\PDFS\ZOHO_PRE.PDF"
cFile := "/X:/PdfS/ZOHO_PRE.Pdf"
Depura(cFile)

oHttp:SetRequestHeader("file", CfILE)

try
   ohttp:Send()
catch
   Msginfo("Error en el envio de datos de cliente")
   RETURN NIL
end

cRespuesta := ohttp:responseText
hHashRes := hb_jsondecode(cRespuesta) //, @aHashRes)
Depura(hHashRes)
Depura("RESPUESTA>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
Depura(hHashRes)
Depura("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<FIN RESPUESTA")
La respuesta del servidor es
Code (fw): Select all Collapse
: [code] => C=> "INVALID_DATA"
10748: [message] => C=> "the request does not contain any file"
10748: [status] => C=> "error"
Me está diciendo que el fichero no se adjunta

Gracias
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Re: Subuir un fichero a un servidor
Posted: Wed Nov 29, 2023 06:28 AM
Buenos dias

Sigo atascado con este problema y no consigo enviar el fichero.
Ya e conseguido enviar datos y que los acepte usando curl, pero lo que no consigo es enviar el fichero

Este codigo funciona
Code (fw): Select all Collapse
hData1   := { => }
hData2   := { => }
hMensaje := { => }

hData1[ "CodigoWG"    ] := Cero(RANDOM(999999), 6)
hData1[ "Last_Name"   ] := "Last_Name"
hData1[ "Company"     ] := "Company"
hMensaje["data"] := { hData1 }
xJson := hb_jsonEncode(hMensaje)

   if ! empty( hCurl := curl_easy_init() )
        curl_easy_setopt( hCurl, HB_CURLOPT_POST, 1 )
        curl_easy_setopt( hCurl, HB_CURLOPT_URL, cWeb)
        curl_easy_setopt( hCurl, HB_CURLOPT_DL_BUFF_SETUP )
        curl_easy_setopt( hcUrl, HB_CURLOPT_HTTPHEADER , {'Authorization: Zoho-oauthtoken ' + cToken})
        curl_easy_setopt( hCurl, HB_CURLOPT_POSTFIELDS, xJson )

        if curl_easy_perform( hCurl ) == 0
           uValue = curl_easy_dl_buff_get( hCurl )
        endif

   endif


hHashRes := hb_jsondecode(uValue) //, @aHashRes)
Depura(hHashRes)
Depura("RESPUESTA>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
Depura(hHashRes)
Depura("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<FIN RESPUESTA")
Pero cuando intento enviar el fichero no me funciona y no encuentro información de como indicarle a curl los datos del fichero que quiero enviar

Estoy usando este código pero no funciona, ya he probado todo lo que se me ocurre para indicarle el cFile , además no está definido HB_CURLOPT_RETURNTRANSFER
Code (fw): Select all Collapse
     cFile := "X:/PdfS/ZOHO_PRE.Pdf"

        curl_easy_setopt( hcUrl, HB_CURLOPT_URL, cWeb)
        //curl_easy_setopt( hcUrl, HB_CURLOPT_RETURNTRANSFER , .T.)
        curl_easy_setopt( hcUrl, HB_CURLOPT_ENCODING , '')
        curl_easy_setopt( hcUrl, HB_CURLOPT_MAXREDIRS , 10)
        curl_easy_setopt( hcUrl, HB_CURLOPT_TIMEOUT , 0)
        curl_easy_setopt( hcUrl, HB_CURLOPT_FOLLOWLOCATION , .t.)
        curl_easy_setopt( hcUrl, HB_CURLOPT_HTTP_VERSION , HB_CURL_HTTP_VERSION_1_1)
        curl_easy_setopt( hcUrl, HB_CURLOPT_CUSTOMREQUEST , 'POST')
        curl_easy_setopt( hcUrl, HB_CURLOPT_HTTPHEADER , {'Authorization: Zoho-oauthtoken ' + cToken})
        //curl_easy_setopt( hCurl, HB_CURLOPT_POSTFIELDS, xJson )
Gracias a todos
Un saludo
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Subuir un fichero a un servidor
Posted: Wed Nov 29, 2023 07:25 AM
Te falta decirle que lo que quieres es subir un fichero: HB_CURLOPT_UPLOAD,
https://forum.modharbour.app/viewtopic.php?p=249&sid=b33df17b6d0293ded0071e42d6389e88#p249
Eso sí, asegúrate de que el TIMEOUT sea adecuado a la velocidad de tu internet y tiempos de respuesta de tu servidor ( ahora tienes 0, por si acaso, ponle un valor suficiente y no dejes que el sistema decida )
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 309
Joined: Wed Mar 28, 2018 04:38 PM
Re: Subuir un fichero a un servidor
Posted: Wed Nov 29, 2023 08:59 AM
miarcod wrote:Si intento usar la funcion
Code (fw): Select all Collapse
hCurl := curl_easy_init()
El programa no se ejectua
Incluyes las librerías hbcurl y hbcurls?
--------

¿ Y porque no ?

¿ And why not ?
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: Subuir un fichero a un servidor
Posted: Wed Nov 29, 2023 02:55 PM
Hola como vas?
miarcod wrote:Buenos dias

Sigo atascado con este problema y no consigo enviar el fichero.
Ya e conseguido enviar datos y que los acepte usando curl, pero lo que no consigo es enviar el fichero

Este codigo funciona
Code (fw): Select all Collapse
hData1   := { => }
hData2   := { => }
hMensaje := { => }

hData1[ "CodigoWG"    ] := Cero(RANDOM(999999), 6)
hData1[ "Last_Name"   ] := "Last_Name"
hData1[ "Company"     ] := "Company"
hMensaje["data"] := { hData1 }
xJson := hb_jsonEncode(hMensaje)

   if ! empty( hCurl := curl_easy_init() )
        curl_easy_setopt( hCurl, HB_CURLOPT_POST, 1 )
        curl_easy_setopt( hCurl, HB_CURLOPT_URL, cWeb)
        curl_easy_setopt( hCurl, HB_CURLOPT_DL_BUFF_SETUP )
        curl_easy_setopt( hcUrl, HB_CURLOPT_HTTPHEADER , {'Authorization: Zoho-oauthtoken ' + cToken})
        curl_easy_setopt( hCurl, HB_CURLOPT_POSTFIELDS, xJson )

        if curl_easy_perform( hCurl ) == 0
           uValue = curl_easy_dl_buff_get( hCurl )
        endif

   endif


hHashRes := hb_jsondecode(uValue) //, @aHashRes)
Depura(hHashRes)
Depura("RESPUESTA>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
Depura(hHashRes)
Depura("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<FIN RESPUESTA")
Pero cuando intento enviar el fichero no me funciona y no encuentro información de como indicarle a curl los datos del fichero que quiero enviar

Estoy usando este código pero no funciona, ya he probado todo lo que se me ocurre para indicarle el cFile , además no está definido HB_CURLOPT_RETURNTRANSFER
Code (fw): Select all Collapse
     cFile := "X:/PdfS/ZOHO_PRE.Pdf"

        curl_easy_setopt( hcUrl, HB_CURLOPT_URL, cWeb)
        //curl_easy_setopt( hcUrl, HB_CURLOPT_RETURNTRANSFER , .T.)
        curl_easy_setopt( hcUrl, HB_CURLOPT_ENCODING , '')
        curl_easy_setopt( hcUrl, HB_CURLOPT_MAXREDIRS , 10)
        curl_easy_setopt( hcUrl, HB_CURLOPT_TIMEOUT , 0)
        curl_easy_setopt( hcUrl, HB_CURLOPT_FOLLOWLOCATION , .t.)
        curl_easy_setopt( hcUrl, HB_CURLOPT_HTTP_VERSION , HB_CURL_HTTP_VERSION_1_1)
        curl_easy_setopt( hcUrl, HB_CURLOPT_CUSTOMREQUEST , 'POST')
        curl_easy_setopt( hcUrl, HB_CURLOPT_HTTPHEADER , {'Authorization: Zoho-oauthtoken ' + cToken})
        //curl_easy_setopt( hCurl, HB_CURLOPT_POSTFIELDS, xJson )
Gracias a todos
Un saludo
Correcto para enviar datos, lo puedes hacer manera fácil, pero cuando necesitas enviar un fichero, debes indicarle a curl que tipo de fichero vas enviar. En php hay una función que se encarga de "convertir" el archivo para que pueda ser enviado al servidor. Estuve buscando en el foro, pero no se en donde buscar la traducción de la función curl_file_create, de casualidad alguno de los masters sabe que se debe hacer, o en donde buscar la traducción de esa funcion?
Code (fw): Select all Collapse
$cfile = curl_file_create('resource/test.png','image/png','testpic'); // try adding
https://www.php.net/manual/es/class.curlfile.php#115569

miarcod, por otro lado, no se si tengas el control de lado del servidor?, si lo tienes puedes subir cualquier archivo en modo dato y luego convertirlo al formato real.

De antemano gracias
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 408
Joined: Fri Jan 29, 2010 08:14 PM
Re: Subuir un fichero a un servidor
Posted: Wed Nov 29, 2023 07:54 PM
Buenas tardes:

En mi blog tienes un programa pFTP ver 1.0 32bits completo, lo he estado usando años sin problemas, solo tienes que configurar el programa y listo. Puedes crear y borrar carpetas en el servidor y todo lo necesario. Ahí tienes todo el código fuente disponible para ti y para quien lo necesite.

Un saludo
Javier LLoris
javierllorisprogramador@gmail.com

Blogs personales:
Programación: https://javierlloris.blogspot.com/
Japonés: https://bitacorajaponesa.blogspot.com/
Cubos de Rubik: https://www.instagram.com/jllorispersonal/?next=%2Falbarakatr%2Ffeed%2F&ref=2ybz0gmvul
Tengo una colección de unos 100 cubos de todo tipo de formas geométricas, todos resueltos, en instagram solo hay unos cuentos cubos.
Libreria: FWH/FWH1109 + Harbour 5.8.2 + Borland C++ 5.8.2
Editor de Recursos: PellecC
ADA, OURXDBU
S.O: XP / Win 7 /Win10
Blog: http://javierlloris.blogspot.com.es/
e-mail: javierllorisprogramador@gmail.com
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: Subuir un fichero a un servidor
Posted: Wed Nov 29, 2023 08:10 PM
Javier gracias por responder...

Lo que pasa es que hay que enviar los archivos a una url por "WEB", con el método POST. No por FTP :oops: como tu eficientemente los haces un tu aplicación.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 408
Joined: Fri Jan 29, 2010 08:14 PM
Re: Subuir un fichero a un servidor
Posted: Wed Nov 29, 2023 08:49 PM
Buenas tardes leandro:

Ok no había leido todas las respuestas, gracias leandro. Lo probaré de paso con las soluciones de los compañeros.

Javier Lloris
javierllorisprogramador@gmail.com
Blogs personales:
Programación: https://javierlloris.blogspot.com/
Japonés: https://bitacorajaponesa.blogspot.com/
Cubos de Rubik: https://www.instagram.com/jllorispersonal/?next=%2Falbarakatr%2Ffeed%2F&ref=2ybz0gmvul
Tengo una colección de unos 100 cubos de todo tipo de formas geométricas, todos resueltos, en instagram solo hay unos cuentos cubos.
Libreria: FWH/FWH1109 + Harbour 5.8.2 + Borland C++ 5.8.2
Editor de Recursos: PellecC
ADA, OURXDBU
S.O: XP / Win 7 /Win10
Blog: http://javierlloris.blogspot.com.es/
e-mail: javierllorisprogramador@gmail.com
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Re: Subuir un fichero a un servidor
Posted: Thu Nov 30, 2023 05:37 AM
Buenos dias y gracias a todos por vuestra colaboración

Ya consigo utilizar curl para la comunicación con el servidor, he tenido que copiar en la ruta del ejecutabale las dlls LIBCURL.DLL y MSVCR120.DLL

Usando la libreria ya consigo enviar datos en modo texto, pero sigo atascado en el envio del PDF

Este es el codigo que utilizo
Code (fw): Select all Collapse
STATIC FUNCTION TestSend2(cAccess_Token)
Local cFile, cUrlAcceso, hMime, hcUrl, nRet, cRespuesta
// ========================================================================
//                                                  ENVIAR FICHERO ADJUNTO
// ========================================================================
cFile      := "X:/PdfS/ZOHO_PRE.Pdf"
cUrlAcceso := "https://www.zohoapis.eu/crm/v5/Leads/594992000001640002/Attachments" //+ space(1)

GLog( PADL("ENVIAR FICHERO ADJUNTO",100, ">") )

If ! empty( hCurl := curl_easy_init() )

   curl_easy_setopt( hcUrl, HB_CURLOPT_URL, cUrlAcceso)
   //curl_easy_setopt( hcUrl, HB_CURLOPT_RETURNTRANSFER , .T.)
   curl_easy_setopt( hcUrl, HB_CURLOPT_ENCODING , '')
   curl_easy_setopt( hcUrl, HB_CURLOPT_MAXREDIRS , 10)
   curl_easy_setopt( hcUrl, HB_CURLOPT_TIMEOUT , 1500)
   curl_easy_setopt( hcUrl, HB_CURLOPT_FOLLOWLOCATION , .t.)
   curl_easy_setopt( hcUrl, HB_CURLOPT_HTTP_VERSION , HB_CURL_HTTP_VERSION_1_1)
   curl_easy_setopt( hcUrl, HB_CURLOPT_CUSTOMREQUEST , 'POST')
   curl_easy_setopt( hcUrl, HB_CURLOPT_HTTPHEADER , {'Authorization: Zoho-oauthtoken ' + cAccess_Token})
   //curl_easy_setopt( hCurl, HB_CURLOPT_POSTFIELDS, xJson )
   curl_easy_setopt(hCurl, HB_CURLOPT_VERBOSE, 1)
   curl_easy_setopt(hCurl, HB_CURLOPT_UPLOAD, 1)
   //curl_easy_setopt(hCurl, HB_CURLOPT_UL_FILE_SETUP, cFile )
   curl_easy_setopt(hCurl, HB_CURLOPT_UL_FILE_SETUP, @cFile )

   nRet := curl_easy_perform( hCurl )
   Depura(nRet, "nRet (233)")
   If nRet == 0
     cRespuesta = curl_easy_dl_buff_get( hCurl )
   Else
     cRespuesta := "Error " + NTRIM(nRet) + curl_easy_dl_buff_get( hCurl )
   endif
EndIf
Depura(cRespuesta)
RETURN NIL
El codigo de error es 23 //#define HB_CURLE_WRITE_ERROR 23 /* */
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Re: Subuir un fichero a un servidor
Posted: Thu Nov 30, 2023 06:10 AM
Hola de nuevo

Para intentar salir del paso, estoy intentando el envío desde la linea de comandos.
He buscado y probado todo lo que encuentro pero no lo consigo tampoco.
curl --location 'https://www.zohoapis.eu/crm/v5/Leads/594992000001640002/Attachments' --header 'Authorization: Zoho-oauthtoken 1000....' --form 'file=@"/E:/postman-portable/ZOHO_PRE.PDF"'
obtengo el error

curl: (26) Failed to open/read local data from file/application

Alguien podría pasarme un ejemplo de como subir el fichero desde la línea de comandos (supongo que se podrá)

Gracias de nuevo
Posts: 309
Joined: Wed Mar 28, 2018 04:38 PM
Re: Subuir un fichero a un servidor
Posted: Thu Nov 30, 2023 07:29 AM

Yo hice un conector con prestashop y profundicé bastante con curl, pero la subida de los ficheros no llegué a conseguirla, al final lo hice ejecutando el curl.exe para la subida.

--------

¿ Y porque no ?

¿ And why not ?