In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Descargar del Drive

Foro de Xailer profesional en español
Responder
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Descargar del Drive

Mensaje por XeviCOMAS »

Hay alguna manera de poder descargar un archivo del Drive desde Xailer, pero en modo "silencioso", sin actuación por parte del usuario de la aplicación. ???

Si hago...

Local cUrl := "https://drive.google.com/file/d/miarchivocompartido/"
ShellExecute( 0, "open", cURL, 0, 0, SW_SHOWNORMAL )

Me abre el explorador con el archivo correctamente que he solicitado... pero, claro, el usuario tiene que interactuar y clicar en descargar el archivo, y/o seleccionar la carpeta para guardar y finalmente cerrar la ventana.

Seria posible hacerlo sin interacción del usuario???

Gracias
Un Saludo,
Xevi.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9252
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Descargar del Drive

Mensaje por ignacio »

Buenos días,

Nunca he intentado hacerlo, pero estoy convencido que la única forma de hacerlo de forma silenciosa es con un Token para OAuth 2.0 https://developers.google.com/identity/protocols/OAuth2.

Tenemos algo hecho al respecto para GMail (\samples\Gmail), pero lógicamente habría que adaptarlo para GDrive. De momento no tenemos intención de meternos con ello. Lo siento. Es posible que haya algún ActiveX con dicha funcionalidad ya en el mercado.

Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Descargar del Drive

Mensaje por XeviCOMAS »

Solucionado.!!!

Solicité consejo a Cristobal Navarro, que dió la conferencia sobre las APIs de Google, y me proporcionó una funcioncilla para descargar ficheros sin necesidad de utilizar las APIs
Un Saludo,
Xevi.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Descargar del Drive

Mensaje por jfgimenez »

Xevi,

si el fichero que quieres descargar es público y conoces su URL puedes usar la clase TAsyncFileDownload para descargarlo en segundo plano. Supongo que lo que te ha dicho Cristobal es algo similar, porque si el fichero no es público creo que no hay ninguna forma de descargarlo sin usar la API de google, tal y como te dijo Ignacio. Si conoces alguna forma de hacerlo, sería bueno que la explicaras para que todos la conozcamos.
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Descargar del Drive

Mensaje por XeviCOMAS »

El fichero es público... bien si, lo tengo compartido y lo descargo accediendo a un link https de Drive, que me lo facilita al compartir el fichero.
De hecho, igual no me expliqué bien o no se me preguntó bien como tenia el fichero en Drive.

Lo pruebo con TAsyncFileDownload como bien me has indicado.

Gracias.
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Descargar del Drive

Mensaje por XeviCOMAS »

Jose,

No consigo hechar a andar TAsyncFileDownload

Código: Seleccionar todo

METHOD Button1Click( oSender ) CLASS TFrmConfiguracio

   WITH OBJECT ::oAsynFileDownload1
   :cLocalFile := "Prueba.zip"
   :cRemoteFile := "https://drive.google.com/file/d/151DYvK_Nvi1jdv9j6SnTXHE4OsASVRv6"
   :lConnected := .T.
LogDebug( :Run() )
LogDebug( :lSuccess )
LogDebug( :cError )
   END WITH

RETURN Nil

con un ShellExecute, si, pero no en silencioso...

Código: Seleccionar todo

METHOD HyperLinkDriveClick( oSender, nFlags, nPosX, nPosY ) CLASS TFrmConfiguracio
   ShellExecute( 0, "open", "https://drive.google.com/file/d/151DYvK_Nvi1jdv9j6SnTXHE4OsASVRv6/view?usp=sharing", 0, 0, SW_SHOWNORMAL )
RETURN Nil
Que hago mal en TAsyncFileDownload ???

Gracias.
Un Saludo,
Xevi.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Descargar del Drive

Mensaje por jfgimenez »

Xevi,

recuerda que TAsynFileDownload() descarga de forma asíncrona en segundo plano. Por lo tanto, después de ejecutar :Run(), el control vuelve a tu programa sin haber descargado todavía nada de nada. Lo que tienes que hacer es asignar el evento OnDisconnect, y en el código de ese evento hacer las comprobaciones correspondientes (si ha habido error o si el fichero se ha descargado correctamente). Si quieres, también puedes usar los eventos OnTotalLengthInfo y OnTotalDnLoadInfo si quieres mostrar una progressbar o indicar el porcentage que lleva descargado.
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Descargar del Drive

Mensaje por XeviCOMAS »

Jose,

Puesto así...

Código: Seleccionar todo

METHOD Button1Click( oSender ) CLASS TFrmConfiguracio

   WITH OBJECT ::oAsynFileDownload1
   :cLocalFile := "Prueba.zip"
   :cRemoteFile := "https://drive.google.com/file/d/151DYvK_Nvi1jdv9j6SnTXHE4OsASVRv6"
   :lConnected := .T.
:OnDisconnect := {|o| LogDebug( "lSuccess", o:lSuccess ), LogDebug( "cError", o:cError ) }
LogDebug( :Run() )
   END WITH

RETURN Nil

lSucces me retorna .T.
cError me retorna vacio

Pero no descarga nada.

Crea el fichero Prueba.zip, pero bytes 0

El método Run() se encarga de hacer la descarga, no???
Los métodos OnTotalLengthInfo y OnTotalDnLoadInfo son por si quiero información MIENTRAS descarga, no???

Pues no descarga.
Un Saludo,
Xevi.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Descargar del Drive

Mensaje por jfgimenez »

Xevi,

esa URL no devuelve el archivo, sino una página web con un botón para descargarlo. Puedes verlo si copias la URL directamente al navegador. Lo que necesitas es la URL final de descarga, la que de verdad devuelve el archivo.

Has comentado que Cristobal te había dicho un truco para descargarlo... prueba con la URL que te haya dicho él.
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Descargar del Drive

Mensaje por XeviCOMAS »

Jose,

no, con la direccion que me funciona que me ha pasado Cristóbal no funciona con TAsyncFileDowload
Sin embargo, con el "truco" que me ha pasado SI me está funcionando.

No posteo la direccion que me ha pasado / truco por deseo expreso de él.

Aunque el tema lo tenga resuelto por la parte que te he comentado, sólo es por utilizar la clase de Xailer ya que si está implementada, que mejor que usarla.
Pero el resultado final no es el deseado.

No se, algun fichero colgado en una web para poder probar la descarga con TAsyncFileDownload ???
O algun Sample???

Gracias por tu tiempo.
Un Saludo,
Xevi.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Descargar del Drive

Mensaje por jfgimenez »

Xevi,

Por lo que he visto, el "truco" consiste en cambiar una parte de la URL. Afortunadamente, en Internet es casi imposible guardar un secreto ;-)

No te estaba funcionando porque al descargar el archivo, google no proporciona el tamaño del mismo antes de comenzar la descarga. O lo que es lo mismo, la clase recibía que el tamaño del archivo es de 0 bytes, y por eso no llegaba a descargarlo.

Adjunto un ejemplo funcionando correctamente con tu archivo. Dento del proyecto está el .o del módulo correspondiente corregido.
Adjuntos
FileDownload.zip
(4.47 KiB) Descargado 149 veces
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Descargar del Drive

Mensaje por XeviCOMAS »

Jose,

Perfecto, como siempre!!!

También es verdad... hoy en dia, no hay secretos con internet!!!
Googleando un poco, un pocquiiiito solamente...

https://sites.google.com/site/sitescapt ... s-directos

Así pues habia un error y no todo era error mio!!!, jejeje.

Mucho mejor así, de esta manera, se controla la descarga e incorporo un ProgessBar.
Incorporo, pues, la descarga de archivos utilizando TAsyncFileDownload.

Gracias.
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Descargar del Drive

Mensaje por XeviCOMAS »

Una cosilla más...

Para que la descarga no sea en otro hilo, o sea que la aplicación no continue hasta que se haya descargado el archivo.

Existe una clase TFileDownload o alguna propiedad a la clase TAsyncFileDownload para que ésta no descargue en multihilo???

O lo tengo que controlar con los eventos/propiedades existentes en la clase???


Gracias.
Un Saludo,
Xevi.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Descargar del Drive

Mensaje por jfgimenez »

Xevi,

siempre puedes crear un formulario modal, de forma que el usuario no pueda hacer nada hasta que termine la descarga. Por otro lado, también puedes usar la clase TInternet, que no es asíncrona.
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Descargar del Drive

Mensaje por jfgimenez »

Xevi,

lo que yo hago es descargar la actualización siempre en segundo plano, y sólo aviso al usuario cuando ya está lista la descarga. Así le evito tener que estar esperando. Personalmente me parece más elegante.
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Descargar del Drive

Mensaje por XeviCOMAS »

Gracias, Jose.

Como me interesa no cambiar en esta parte de mi aplicación, ya que la descarga del FTP la tengo hasta hoy así,... "bloqueo" la aplicación con una variable a .T. o a .F. en los eventos OnConnect/OnDisconnect

Y luego...

Código: Seleccionar todo

...
Static lDownLoadDrive := .F.
...
         WITH OBJECT ::oAsynFileDownload1
         :cRemoteFile := cUrl
         :cLocalFile := cMiFileLocal
         :OnConnect := {|| lDownloadDrive := .T. }
         :OnDisconnect := {|| lDownloadDrive := .F. }
         :Run()
         END WITH
         while lDownloadDrive
            ProcessMessages()
         EndDo
Ta funcionando perfectamente y correctamente!!!

Gracias.
Un Saludo,
Xevi.
Responder