ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

lire un fichier en http   



L'auteur

Black Sabbath
France France
Membre Simple
# 0000000106
enregistré le 03/11/2004

http://omiro.free.fr
65 ans
MIRO Olivier
de la société Institut National du Cancer
Fiche personnelle


Note des membres
pas de note

Contributions > 13 - Web

lire un fichier en http
# 0000000685
ajouté le 15/04/2009 10:23:06 et modifié le 16/04/2009
consulté 9122 fois
Niveau débutant

Version(s) Foxpro :
VFP 9.0

Description

juste mettre le contenu d'un fichier disponible sur internet dans une variable.

Pour cela l'API UrlDownloadToFile pourrait suffire mais elle va lire dans le cache en local. De plus, elle ne rend pas la main immédiatement si il y a un problème...

 

Donc : ? ReadInternetFile("http://oMiro.free.fr/VersionDisponible.txt")

 

Attention à la casse

Attention à la redirection automatique de certains serveurs (Les erreurs 403 ou 404 par ex. ne sont analysées que si le mot est présent dans le titre).

 

Par défaut, le buffer de lecture est de 2 kilo-octets. C'est modifiable directement en passant une seconde variable

? ReadInternetFile(("http://sedoparking.com/parking.php", 255*1024) par exemple.

 

=========== Oubli de la déclaraton de la dll de base...                            =============

=========== 1000 excuses pour ceux qui ont testé avant le 15 avril 13:40 =============

Code source :
FUNCTION ReadInternetFile
LPARAMETERS cURL, bufferSize

IF EMPTY(m.BufferSize)  && U can pass only 1 parameter
  bufferSize = 2*1024  && 2 kOctets
ENDIF

LOCAL cBuffer, NumberOfBytesRead, iReturn, cTxtURL, ;
  hOpen, hOpenURL, cTitle, NbDLL, i1, i2
cBuffer = SPACE(bufferSize)
NumberOfBytesRead = 999
iReturn = 999
cTxtURL = ""

LOCAL ARRAY aAPI(1,3)
NbDLL = ADLLS(aAPI)

DECLARE SHORT InternetGetConnectedState IN wininet.Dll;
  INTEGER @dwFlags, INTEGER dwReserved

DECLARE INTEGER InternetOpen IN wininet.dll;
  STRING  sAgent,;
  INTEGER lAccessType,;
  STRING  sProxyName,;
  STRING  sProxyBypass,;
  STRING  lFlags

DECLARE INTEGER InternetOpenUrl IN wininet.dll;
  INTEGER hInternet,;
  STRING  lpszUrl,;
  STRING  lpszHeaders,;
  INTEGER dwHeadersLength,;
  INTEGER dwFlags,;
  INTEGER dwContext

DECLARE INTEGER InternetReadFile IN wininet.dll;
  INTEGER  hFile,;
  STRING  @sBuffer,;
  INTEGER  lNumBytesToRead,;
  INTEGER @dwNumberOfBytesRead

DECLARE INTEGER InternetCloseHandle IN wininet.dll;
  INTEGER hInet

IF InternetGetConnectedState(@iReturn ,0) != 1
  cTxtURL = "WARNING : Impossible to connect to Internet"
ELSE
  hOpen = InternetOpen(Application.ServerName,1, 0, 0, 0)
  IF m.hOpen = 0
    hOpen = InternetOpen(Application.ServerName,0, 0, 0, 0)
  ENDIF

  IF m.hOpen = 0
    cTxtURL = "WARNING : Impossible to open a connection to Internet"
  ELSE
    #DEFINE GENERIC_READ 0x80000000
    #DEFINE INTERNET_FLAG_NO_CACHE_WRITE 0x4000000 && Pas d'écriture en cache
    hOpenUrl = InternetOpenUrl(m.hOpen,m.cURL,0,0,INTERNET_FLAG_NO_CACHE_WRITE,0)
    IF m.hOpenUrl = 0
      cTxtURL = "WARNING : Incorrect URL"
    ELSE
      DO WHILE (m.iReturn != 0 AND m.NumberOfBytesRead > 0)
        iReturn = InternetReadFile(m.hOpenUrl, @m.cBuffer, bufferSize, @m.NumberOfBytesRead)
        cTxtURL = m.cTxtURL + LEFT(m.cBuffer, m.NumberOfBytesRead)
      ENDDO


      InternetCloseHandle(m.hOpenUrl)

      IF m.iReturn = 0
        cTxtURL = "WARNING : File " + m.cURL + " cannot be read (lag?)"
      ELSE
        i1 = AT("<title>", m.cBuffer)
        i2 = AT("</title>", m.cBuffer)
        cTitle = IIF(m.i2 >= m.i1, ;
                SUBSTR(m.cBuffer,i1,i2-i1),;
                "")
        cTxtURL = ICASE(  "403" $ m.cTitle, "WARNING : Error 403 (File " + m.cURL + ")",;
                    "404" $ m.cTitle, "WARNING : Error 404 (File " + m.cURL + ")", ;
                    ALLTRIM(m.cTxtURL);
                    )

      ENDIF
    ENDIF
      InternetCloseHandle (m.hOpen)
  ENDIF
ENDIF

IF ASCAN(m.aAPI,"InternetGetConnectedState",2,m.NbDLL-1,2) = 0
  CLEAR DLLS InternetGetConnectedState
ENDIF

IF ASCAN(m.aAPI,"InternetOpen",2,m.NbDLL-1,2) = 0
  CLEAR DLLS InternetOpen
ENDIF

IF ASCAN(m.aAPI,"InternetOpenUrl",2,m.NbDLL-1,2) = 0
  CLEAR DLLS InternetOpenUrl
ENDIF

IF ASCAN(m.aAPI,"InternetReadFile",2,m.NbDLL-1,2) = 0
  CLEAR DLLS InternetReadFile
ENDIF

IF ASCAN(m.aAPI,"InternetCloseHandle",2,m.NbDLL-1,2) = 0
  CLEAR DLLS InternetCloseHandle
ENDIF

RETURN cTxtURL
Commentaires
Aucun commentaire enregistré ...

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2024.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3