Connection HTTP pour récupérer un fichier binaire [VB] - VB/VBA/VBS - Programmation
Marsh Posté le 15-04-2004 à 10:55:46
excuse mais chuis intéressé par ton code qui récupère le page web, ya moyen que tu le mettes ici ?
Marsh Posté le 15-04-2004 à 11:02:49
Si tu veux. Le voilà :
Code :
|
PS: j'ai laissé les url et tout, m'en fout c'est des adresses internes
PS²: Par contre, c'est loin de faire ce que tu veux à mon avis, ce programme sert à télécharger des documents à partir d'une appli intranet, donc c'est pas du tout gééraliste, à mon avis tu ne pourras pas en faire grand chose
Marsh Posté le 15-04-2004 à 11:29:32
Pour ceux que ça intéresse, c'est ce tuto que j'avais suivie.
http://www.vbip.com/winsock/index.asp
Seul problème, c'est que l'accès à des fichiers binaires vient après un tas de trucs dont je n'ai pas besoin, et le code est du coup trop complexe pour que j'y comprenne quoi que ce soit
Par contre, ce tuto est vraiment très bien et couvre un peu tout les domaines (www, ftp, smtp, application distribuée, chat, etc.)
Marsh Posté le 15-04-2004 à 14:11:25
Du nouveau.
J'ai comparé les deux fichiers (le bon et le mauvais)
C'est encore plus bizarre que ça...
=> Ils sont rigoureusement identiques SAUF que celui qui est foireux s'arrête d'un coup, à 301 886 octets.
La taille ne semble pas "ronde", donc j'en déduit que c'est pas un problème au niveau de la taille de la chaîne de caractère.
En regardant en Hexa, je pensais tomber sur un caractère à la con, style EOF, qui aurait pu foutre en l'air la représentation des données dans une chaîne de caractères, mais même pas !
En effet, j'ai à la fin du fichier foireux la suite :
2a 45 __ (ça s'arrête là)
Alors que dans le fichier original, j'ai :
2a 45 4a 3b 27
=> Ce ne sont même pas des caractères spéciaux, ça correspond à la chaîne " *EJ:' "
Là je sèche vraiment, je ne comprends pas ce qui fait que ça ne fonctionne pas
Marsh Posté le 15-04-2004 à 14:53:53
Merci pour votre aide
Bon, j'ai résolu mon problème (mais alors là il va falloir m'expliquer comment ! )
En fait, j'ai juste rajouté : "vbString" en paramètre de getData :
wscHttp.GetData strData, vbString
Et maintenant le fichier se charge correctement
Marsh Posté le 15-04-2004 à 16:28:06
Bon, maintenant j'ai un autre problème
Private dom As DOMDocument
Function machin()
Set dom = New DOMDocument
dom.async = False
If Not dom.Load(siteRoot & "bin/menus.xml.asp?CODLAN=" & language) Then
MsgBox "Can't contact server, or data error. Can't initialize filters."
End
End If
End Function
Premier passage dans la fonction, ça passe.
Second passage, systématiquement j'ai une erreur comme quoi la source est indisponible. L'erreur est instantanée.
J'ai essayé de trouver un .Close ou autre pour forcer le dom à bien se vider avant d'en charger une nouvelle couche, mais j'ai pas trouvé. J'ai donc tenté de faire un set dom = Nothing avant l'affectation du constructeur, mais toujours la même donne, même erreur.
De quoi ça peut venir
J'utilise MSXML 3.0
Marsh Posté le 21-01-2005 à 15:01:27
j'ai à peu prés le même problème que le tien, je voudrai me connecter à un site et ensuite y envoyer une requête qui va me retourner les données dont j'ai besoin. Mais je n'ai pas accés à la base de données du site et le site est fait en ASP tandis que mon application est faite en VBA. je ne sais pas si tu as une idée de comment je pourrai le faire. merci
Marsh Posté le 24-01-2005 à 14:37:44
Alors, tout bête :
Ta page ASP doit retourner un flux HTML de ce type : (ou un XML à la limite)
Code :
|
(des DIV nommées avec ID, contenant un flux CSV, avec retour à la ligne sous forme de <br/> )
Ensuite, dans ta macro, tu lies "Internet Controls"
Puis ta macro :
Code :
|
A quelques bugs prêt (pas testé ) ça doit marcher
Marsh Posté le 24-01-2005 à 16:07:01
peux-tu m'expliquer ce qui fait ce code stp!!!
Marsh Posté le 24-01-2005 à 16:15:32
Il ouvre IE dans une fenêtre invisible.
Il va ensuite sur la page ASP dont tu as besoin (n'oublie pas de passer les éventuels paramètres en QueryString).
Ensuite, il attend que la page aie fini de charger.
Et quand c'est fini, il recherche les deux blocs de données (dans mon exemple) puis les parcours ligne pas ligne (le premier split) puis valeur par valeur (le second split imbriqué dans la boucle). Une fois que tu as tes valeurs, tu en fait ce que tu veux
Marsh Posté le 24-01-2005 à 16:29:19
je pense que tu vas mieux comprendre si tu jetes un coup d'oeil sur le site à l'adresse suivante:
http://69.159.241.96/alliancewebse [...] ysFilter=0
Marsh Posté le 24-01-2005 à 16:34:37
Nope, je comprends pas mieu
Mais bon, ça doit toujours fonctionner avec mon système, sauf que là, c'est pas du VBA, mais plutôt du VB.NET, ce qui est littéralement différent.
C'est un aspect que je n'ai pas regardé, mais dans le namespace System.Web, il y a tout ce qu'il faut pour communiquer en HTTP avec d'autres sites. Creuse de ce côté là.
Ensuite, t'auras plus qu'à parser le HTML reçu afin de retrouver les infos dont tu as besoin.
Marsh Posté le 24-01-2005 à 19:29:39
si tu as un exemple déjà fait, ça pourrait m'aider beaucoup
Marsh Posté le 24-01-2005 à 19:51:36
Mais crée un autre topic dans la cat "C#/Managed", il y sera plus à sa place.
Marsh Posté le 24-01-2005 à 19:58:20
je ne comprend pas qu'est ce que tu veux dire?
Marsh Posté le 24-01-2005 à 20:04:58
Ben parceque vu que tes pages sont en ASPX, j'en déduit que ça n'a rien à voir avec du VBA, ni même du VB, mais du VB.NET
Hors, le VB.NET, c'est ni plus ni moins que du C# avec une syntaxe différente. Le fonctionnement est le même, et les librairies sont aussi les mêmes.
Pour cette raison, si tu veux des réponses à ton problème, il faut poster ton problème dans C#/Managed (en précisant qu'il s'agit de VB.NET) et non ici, où tu as moins de chances de trouver une personne qui saura répondre à ton problème.
Marsh Posté le 24-01-2005 à 20:11:29
non, mais mon application est en VBA et non en VB.NET
Marsh Posté le 24-01-2005 à 20:14:42
Comprends rien.
Le site que tu m'as montré, c'est celui sur lequel tu dois retrouver les infos ?
Ben le code que je t'ai pondu marche, suffit de l'adapter :
-> Tu peux récupérer les éléments du SELECT afin de simuler le choix d'un site, puis après, en parcourant le tableau retourné, tu trouveras sans problème les données.
ie.Body.Document, c'est l'objet "document" que tu as en JavaScript à l'intérieur d'une page sous Internet Explorer. Tu peux donc utiliser toutes les fonctions JS que tu veux (style "getElementById()", et accéder à tous les éléments HTML depuis ton script VBA).
Marsh Posté le 24-01-2005 à 20:16:39
ben c'est la requête que je ne sais pas comment faire.
désolée je ne connais pas VBA beaucoup...
Marsh Posté le 24-01-2005 à 20:49:19
alors peux-tu me dire comment le faire stp. j'en ai aucune idée
Marsh Posté le 24-01-2005 à 20:52:32
ben je peux pas tout t'expliquer. pour voir le fonctionnement avec un formulaire, tu peux regarder ça :
http://forum.hardware.fr/hardwaref [...] 7024-1.htm
Marsh Posté le 24-01-2005 à 21:04:49
non, je ça ne marche pas, mais si tu peux me faire un petit code qui pourrait m'aider ça sera vraiment gentil.
merciiiii
Marsh Posté le 15-04-2004 à 10:51:46
Bonjour,
Je suis en train de faire un programme VB, qui doit se connecter à un site web, et aspirer une page, ainsi que tous les fichiers qui sont en lien.
J'utilise le composant WinSock afin de me connecter en HTTP au serveur.
Je récupère la page sans problème. Les images GIF et JPG passent aussi sans problème.
Mais les fichiers PDF sont systématiquement corrompus. Ils font pourtant la bonne taille, mais Acrobat Reader ne peux pas les lire.
Si je les télécharge manuellement, ils sont OK.
J'en déduis que ma façon de récupérer les données HTTP n'est pas bonne, et que ça altère les données.
J'utilise actuellement ces fonctions : (wscHttp est le nom de mon contrôle WinSock)
Private Sub wscHttp_Close()
Dim strHttpResponseHeader As String
If Not m_bResponseReceived Then
strHttpResponseHeader = Left$(m_strHttpResponse, _
InStr(1, m_strHttpResponse, _
vbCrLf & vbCrLf) - 1)
m_strHttpResponse = Mid(m_strHttpResponse, _
InStr(1, m_strHttpResponse, _
vbCrLf & vbCrLf) + 4)
m_bResponseReceived = True
End If
End Sub
Private Sub wscHttp_Connect()
Dim strHttpRequest As String
strHttpRequest = "GET " & m_strFilePath & " HTTP/1.1" & vbCrLf
strHttpRequest = strHttpRequest & "Host: " & m_strRemoteHost & vbCrLf
strHttpRequest = strHttpRequest & "Connection: close" & vbCrLf
strHttpRequest = strHttpRequest & "Accept: */*" & vbCrLf
strHttpRequest = strHttpRequest & vbCrLf
wscHttp.SendData strHttpRequest
End Sub
Private Sub wscHttp_DataArrival(ByVal bytesTotal As Long)
On Error Resume Next
Dim strData As String
wscHttp.GetData strData
m_strHttpResponse = m_strHttpResponse & strData
End Sub
Sub downLoadFile(url As String, lfileType As String)
Dim objRegExp As RegExp
Dim objMatch As Match
Dim colMatches As MatchCollection
url = Replace(url, " ", "%20" )
Set objRegExp = New RegExp
objRegExp.Pattern = "(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)"
objRegExp.IgnoreCase = True
objRegExp.Global = True
If objRegExp.Test(url) Then
m_strProtocol = objRegExp.Replace(url, "$1" )
m_strRemoteHost = objRegExp.Replace(url, "$2" )
m_strRemotePort = objRegExp.Replace(url, "$3" )
m_strFilePath = objRegExp.Replace(url, "$4" )
If Len(m_strRemotePort) = 0 Then
m_strRemotePort = "80"
Else
m_strRemotePort = Right(m_strRemotePort, Len(m_strRemotePort) - 1)
End If
fileType = lfileType
m_strHttpResponse = ""
m_bResponseReceived = False
With wscHttp
.Close
.LocalPort = 0
.Connect m_strRemoteHost, m_strRemotePort
Do While .State < 8
DoEvents
Loop
If .State = 9 Then
MsgBox ("Error: Disconnected from server." )
End If
End With
Else
' Cas spécial : Lien de type "file" ou "mailto"
[...]
End If
Exit Sub
ERR_HANDLER_DWL:
m_strHttpResponse = ""
End Sub
Sub saveFile(content As String, fileName As String, filePath As String)
If LCase(Left(fileName, 7)) <> "mailto:" Then
If content <> "m_bytes()" Then
intFile = FreeFile
Open filePath & fileName For Binary Access Write As #intFile
Put #intFile, , content
Close #intFile
Else
intFile = FreeFile
Open filePath & fileName For Binary Access Write As #intFile
Put #intFile, , m_bytes
Close #intFile
End If
End If
End Sub
Comment pourrais-je modifier ma sauce pour récupérer correctement des données binaires ? J'ai trouvé un tuto, mais j'avoue n'avoir rien compris
Deplus, pour les fichiers actuels et la page HTML, est-ce que ça va poser problème si je les télécharge en binaire et non en ASCII comme actuellement ? J'aimerais autant se faire se peu ne pas avoir 36 façons d'accéder aux fichiers.