Page 1 of 1

Subir archivo a un HTTP

PostPosted: Sat Mar 21, 2015 12:11 pm
by TOTOVIOTTI
Amigos,
he estado viendo y probando como descargar un archivo desde HTTP y funciona
perfecto.
La consulta ahora es:
se podrá hacer algo como URLDownLoad, que en vez de bajar, permita subir
un archivo al lugar que le indiquemos?
Desde ya, muchas gracias!
Roberto

Re: Subir archivo a un HTTP

PostPosted: Sun Mar 22, 2015 8:30 am
by FiveWiDi
Yo uso estas funciones, mírateleas con carño. Deberás setetar tus propia variables.

Code: Select all  Expand view
/*----------------------------------------------------------------------------------------*/
* Basado en el siguiente trabajo:                                                         *
* ===============================                                                         *
/*----------------------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------------------*/
*                                                                                         *
*        Archivo: Proc9991.PRG                                                            *
*    Descripcion: Subir ficheros del servidor FTP                                         *
*          Fecha: 11-03-2012                                                              *
*          Autor: Jose Javier LLoris Roig                                                 *
*            Web: http://javierlloris.blogspot.com.es/                                    *
*            Msn: fwh-jll@hotmail.es                                                      *
*                                                                                         *
*       Libreria: FWH/FWHX 11.09                                                          *
*        Harbour: Harbour 5.8.2 release 20120330                                          *
*     Compilador: Borland C++ 5.8.2                                                       *
*            S.O: XP/Win7 no probado en otros S.O                                         *
*                                                                                         *
*    Copyright (C) 2012 José Javier Lloris Roig                                           *
*    Correo electrónico: fwh-jll@hotmail.es                                               *
*    Web: http://javierlloris.blogspot.com.es/                                            *
*                                                                                         *
*    Este programa es software libre: usted puede redistribuirlo y/o modificarlo bajo los *
*    términos de la Licencia Pública General GNU publicada por la Fundación para el       *
*    Software Libre, ya sea la versión 3 de la Licencia, o (a su elección) cualquier      *
*    versión posterior.                                                                   *
*                                                                                         *
*    Este programa se distribuye con la esperanza de que sea útil, pero SIN GARANTÍA      *
*    ALGUNA; ni siquiera la garantía implícita MERCANTIL o de APTITUD PARA UN PROPÓSITO   *
*    DETERMINADO.                                                                         *
*                                                                                         *
*    Consulte los detalles de la Licencia Pública General GNU para obtener una información*
*    más detallada.                                                                       *
*                                                                                         *
*    Debería haber recibido una copia de la Licencia Pública General GNU                  *
*    junto a este programa. En caso contrario, consulte http://www.gnu.org/licenses.      *
/*----------------------------------------------------------------------------------------*/

#Include "FiveWin.CH"

STATIC oFTP
STATIC lFTP := .F.
STATIC aFiles
STATIC nSizeFiles

FUNCTION Traza()
Return Nil

/*------------------------------------------------------------------------------*/
FUNCTION oGetoFTP()
Return oFTP
/*------------------------------------------------------------------------------*/
FUNCTION lIsOpenFTP()
Return lFTP
/*------------------------------------------------------------------------------*/
Function CierraFTP()
Traza( 1, "CierraFTP()" )

If lIsOpenFTP()
    oFTP:Close()
EndIf

DeleteObject( oFTP )
oFTP := NIL
lFTP := .F.

Return Nil
/*------------------------------------------------------------------------------*/
Function lConectaFTP( AMPAARRA )
/*------------------------------------------------------------------------------*/
Local lOk   := .F.

Local cPasswordFTP := RTrim( AMPAarra[2][3][1][19] ) + Space(25)


// comprobamos si tenemos conexion a internet
IF !IsInternet()
    MsgAlert( "Compruebe la conexión a Internet.", "Atención" )
    Return (lFTP := .F.)
END
   
aFiles     := {}
nSizeFiles := 0

/* Comprobamos que en la BD Ftp.DBF estan los datos introducidos para poder */
/* acceder al servidor FTP                                                  */
IF EMPTY( AMPAarra[2][3][1][17] ) .OR.; // Nombre del servidor FTP
   EMPTY( AMPAarra[2][3][1][18] ) .OR.; // Nombre del usuario FTP
   EMPTY( AMPAarra[2][3][1][19] ) .OR.; // Password del usuario del FTP
   EMPTY( AMPAarra[2][3][1][20] )       // Nombre de la carpeta destino en el servidor FTP

    MsgAlert( "Debe de configurar el programa para poder"      +CRLF+;
              "acceder al servidor FTP. Entre en el apartado"  +CRLF+;
              "Configurar programa y introduzca la información"+CRLF+;
              "requerida y vuelva a intentarlo."               +CRLF+CRLF+;
              "Pulse el boton de aceptar para continuar.", "ERROR!!" )
    Return (lFTP := .F.)

END

MsgGet( GetTrad("Atenció!"), RTrim( AMPAarra[2][3][1][17] ) + "-" + RTrim( AMPAarra[2][3][1][18] ) + "-" + GetTrad("Indiqui el Password:"), @cPasswordFTP )
   
Traza( 1, "RTrim( AMPAarra[2][3][1][17] )=", RTrim( AMPAarra[2][3][1][17] ) )
Traza( 1, "RTrim( AMPAarra[2][3][1][18] )=", RTrim( AMPAarra[2][3][1][18] ) )
Traza( 1, "cPasswordFTP=", cPasswordFTP )
Traza( 1, "AMPAarra[2][3][1][20]=", AMPAarra[2][3][1][20] )
Traza( 1, "AMPAarra[2][3][1][21]=", AMPAarra[2][3][1][21] )
Traza( 1, "AMPAarra[2][3][1][22]=", AMPAarra[2][3][1][22] )
Traza( 1, "AMPAarra[2][3][1][23]=", AMPAarra[2][3][1][23] )
   
MsgRun( "Conectando con el servidor FTP",;
        "Espere por Favor..."           ,;
        { || oFtp := ServicesFTP():New( RTrim( AMPAarra[2][3][1][17] ) ,; // Servidor
                                        RTrim( AMPAarra[2][3][1][18] ) ,; // Usuario
                                        AllTrim(cPasswordFTP)         , ;    // RTrim( AMPAarra[2][3][1][19] ) ,; // Contraseña
                                        AMPAarra[2][3][1][21]          ,; // Permitir anonimos
                                        AMPAarra[2][3][1][22]          ,; // Tiempo de respuesta
                                        AMPAarra[2][3][1][23]         )}) // Puerto
SysRefresh()

IF (lOk := (oFtp:nError == 0))
    Traza( 1, "a-oFtp:GetPath()=", oFtp:GetPath() )

    /* Aqueta funció és molt important per que a més a més de carregar
       fitxers en la array 'aFiles', es situa en el directori de FPT.
       ------------------------------------------------------------ */

    CargaFiles( RTrim( AMPAarra[2][3][1][20] ) )

    Traza( 1, "Connectat!!!" )
    Traza( 1, "b-oFtp:GetPath()=", oFtp:GetPath() )
END

Traza( 1, "oFtp:nError:", oFtp:nError ) 
Traza( 1, "lOk=", lOk )

Return ( lFTP := lOk )
/*------------------------------------------------------------------------------*/
Function SubeFichero( AMPAARRA, cFile, lMensaje )
/*------------------------------------------------------------------------------*/

/* Esta función puede usarse sola (directamente), con lo cual en ella se
   realiza la conexión a FTP, o precedida del uso de lConectaFTP() y poscedida de
   CierraFTP(), y en ese caso no se realizará la conexión a FTP en esta función ya que
   se habrá realizado previamente en lConectaFTP().
   Para controlar esta situación se usa la variable lConectadoFTPenSubefichero .
   -------------------------------------------------------------------------------- */

Local lConectadoFTPenSubefichero := .F.

LOCAL cFilePut  := ""
LOCAL cDirBack  := ""
LOCAL lSubido   := .F.

Traza( 1, "lFTP=", lFTP)
Traza( 1, "cFile=", cFile )
Traza( 1, "ValType(oFTP)=", ValType(oFTP) )

//If .Not. lFTP
If .Not. lIsOpenFTP()
    If .Not. lConectaFTP( AMPAARRA )
        Return .F.
    EndIf
    lConectadoFTPenSubefichero := .T.
EndIf

cDirBack := oFtp:GetPath()

oFtp:oFtp:Cwd( oFtp:GetPath() )

Traza( 1, "oFtp:oFtp:Cwd( oFtp:GetPath() )" )

IF !Empty( cFile )

    /* Buscamos si ya existe el fichero en el servidor ftp */
    IF AScan( aFiles, { | aFile | Lower( aFile[1] ) == Lower( cFileNoPath( cFile ) ) } ) > 0

        IF MsgNoYes( "Archivo: " + Lower( cFileNoPath( cFile ) ) + CRLF + CRLF + ;
                     "El fichero ya existe en su sitio FTP." + CRLF + CRLF + ;
                     "¿ Desea reemplazarlo ? ", "Seleccione..." )

            /* Borramos el fichero */
            IF !oFtp:oFtp:Dele( RTrim( cFileNoPath( cFile ) ) )

                MsgAlert( "Archivo: " + RTrim( Lower( cFileNoPath( cFile ) ) ) + CRLF + CRLF + ;
                          "No se ha podido eliminar el archivo." + CRLF + CRLF + ;
                          "Pulse el boton Aceptar para continuar.", "ERROR!!" )
                If lConectadoFTPenSubefichero
                    Traza( 1, "No es pot esborrar." )
                    CierraFTP()
                Endif
                Return( lSubido )
            END
          ELSE
            If lConectadoFTPenSubefichero
                Traza( 1, "No es còpia i es tanca." )
                CierraFTP()
            Endif
            Return( lSubido )
        END
    END
END

MsgRun( "Subiendo el archivo: " + Lower( RTrim( cFileNoPath( cFile ) ) )             ,;
        "Servidor Ftp: " + RTrim( AMPAarra[2][3][1][17]) + " Usuario: " + RTrim( AMPAarra[2][3][1][18] ),;
        { || cFilePut := oFtp:oFtp:MPut( cFile, oFtp:GetPath() )})

SysRefresh()

Traza( 1, "cFilePut=", cFilePut)

IF Empty( cFilePut )

    lSubido  := .F.

    If lMensaje
        MsgAlert( "Archivo: " + Lower( cFileNoPath( cFile ) )                + CRLF + CRLF + ;
                  "El archivo no se ha podido subir a su sitio FTP. Consulte"+ CRLF + ;
                  "con su administrador de sistemas o ISP los permisos"      + CRLF + ;
                  "de escritura de su sitio FTP."                            + CRLF + CRLF + ;
                  "Pulse el boton Aceptar para continuar.", "ERROR!!" )

    EndIf
   
  ELSE

    lSubido  := .T.

    If lMensaje
        MsgInfo( "Ruta de acceso remoto predeterminado: " + oFtp:GetPath() + CRLF + ;
                 "Archivo: " + Lower( cFileNoPath( cFile ) )               + CRLF + CRLF + ;
                 "El archivo se ha subido correctamente a su sitio FTP."   + CRLF + CRLF + ;
                 "Pulse el boton Aceptar para continuar." )
    EndIf
END

If lConectadoFTPenSubefichero
    Traza( 1, "Al final" )
    CierraFTP()
Endif

If lsubido
  Else
    Inkey(1)
EndIf

Return( lSubido )
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
STATIC Function CargaFiles( cPath )
/*------------------------------------------------------------------------------*/

   DEFAULT cPath := "/"

   aFiles     := oFtp:ScrollDir( If( cPath == "/", "/", ( RTrim( cPath ) + "/" ) ) )
   nSizeFiles := oFtp:nSizeFiles

Return NIL
 

Re: Subir archivo a un HTTP

PostPosted: Sun Mar 22, 2015 11:44 am
by TOTOVIOTTI
Carlos
gracias por responder, ésta funcion que envías es para subir y bajar a una FTP.
Eso no tengo problemas porque ya lo tengo desarrollado, el tema es poder grabar
un archivo en la carpeta PUBLIC de una http.
Usas esta misma función para eso?
Saludos
Roberto

Re: Subir archivo a un HTTP

PostPosted: Sun Mar 22, 2015 12:48 pm
by russimicro
Ver tema...

protocolo http... seguridad... restricciones

Re: Subir archivo a un HTTP

PostPosted: Mon Mar 23, 2015 12:22 pm
by Carlos Mora
Roberto,

TOTOVIOTTI wrote:... el tema es poder grabar un archivo en la carpeta PUBLIC de una http.


Ampliando un poco lo que menciona Russimicro: Por cuestiones de seguridad lo que pedís es un poco ruleta rusa. Imaginate, por ejemplo, que subo un archivo malaleche.php. Despues me voy al navegador y pongo http://tuwebmcom.ar/malaleche.php y lo podría ejecutar con los permisos del servidor web, que frecuentemente suelen ser de administrador o parecido.

He visto que algo de PHP usas, hay mucho ya escrito en ese lenguaje para subir cosas, como recomendación te diría que las carpetas con archivos para carga y descarga tienen que estar FUERA del PUBLIC, sino alguien mal intencionado podría subir y ejecutar código, y por otro lado sería bueno que haya un control para subir y bajar archivos, que no sea cualquiera el que pone y saca.

Esto que te digo es solo a nivel protocolo y organización. Tambien deberías estudiar la posibilidad de usar https o sftp si la información que se transmite esta sujeta a la protección de datos.

Fuera de tema. Viendo tu firma veo que sos de San Francisco!
Hace ya más de 10 años viví en Córdoba Capital, y tuve algunos clientes por tus pagos. ¡Que ciudad linda San Francisco!

Un saludo

Re: Subir archivo a un HTTP

PostPosted: Wed Mar 25, 2015 1:05 pm
by TOTOVIOTTI
Hola Carlos!
No sabías que conocías por éstos lares! Que bueno!
Amigo, entiendo la peligrosidad, me habían comentado, tengo un problema con unos servicios
de internet, que me bloquean la descarga de las actualizaciones de mi sistema, desde la ftp,
por lo que, pensé que de esa manera, podría solucionarlo.
Como bajar desde la URL funciona correcto, pensé que por el tráfico que tiene mi página,
nadie se iba a poner a infectarme, lo tendré en cuenta!
Muchas gracias y me alegro que hayas estado por acá!
Linda nuestra provincia, Córdoba!
Abrazo.

Re: Subir archivo a un HTTP

PostPosted: Wed Mar 25, 2015 3:05 pm
by Carlos Mora
Toto,

Respecto del tema de la seguridad, es algo que hasta que no te pasa uno no se da cuenta. En la oficina tenemos varias aplicaciones web, tenemos 4 ips fijas, y varios servidores LAMP y algún windows. Es _increíble_ la cantidad de ataques diarios que se sufren, sin ningún motivo particular, solo buscándote alguna vulnerabilidad, y de los lugares más extraños del mundo. Hemos traceado IPs de EEUU, Rusia, China, Corea, Iran, Brasil, etc. y ves que solo te están buscando por donde entrarte. Al final, y como una medida precautoria, se configuraron los firewalls de forma tal que solo se responden peticiones de dentro del pais, y los segmentos IP conocidos de algunos clientes que usan proxies y que sabemos de donde vienen.

Respecto de actualizaciones de EXEs, es complicado cuando no es uno el que controla los servicios. Lo mejor es zipear+encriptar+renombrar, y hacerte tu propio instalador. En el blog de Biel creo que había un post donde explicaba como armar un actualizador muy lindo, seguro podrás sacar ideas.

Algo que te puede resultar interesante es contratar una VPS en lugar de solo hosting, una maquina virtual chica te sale un par de dolares al mes pero vos haces y deshaces como mejor te da la gana, y no dependés de los criterios particulares de un administrador que tiene que lidiar con miles de dominios a la vez.

Ya sabés, para lo que haga falta.

Abrazo

Re: Subir archivo a un HTTP

PostPosted: Tue Mar 31, 2015 6:56 pm
by MarioG
Gente:
No se si estaré m... fuera del tarro. Pero leyendo el post de Carlos, entro en "panico".
Tengo un espacio web de un servidor free. Alli subo las actualizaciones de precios (dbfs) que se bajan de un par de sucursales. Esto entra dentro de la facil vulnerabilidad? (no uso la carpeta public, sino una creada al efecto).
En cuanto a las app, considero que es muy lindo y creo que da un aspecto muy profesional el que las actualizaciones se hagan via web.
Pero habiendo hoy tantos espacio gratuito enla nube: Google Drive, Dropbox, OneDrive... etc. etc. No resulta mas sencillo y seguro usar esos lugares?
(mas allá de que sobre gustos no hay nada escrito :) )