Comment télécharger tout les fichiers d'un dossier avec le IdHTTP ? - Delphi/Pascal - Programmation
Marsh Posté le 07-09-2004 à 23:50:18
Si avec un browser web tu vois la liste des fichiers, c'est possible. Tu downloades cette liste (www.monsite.com/dossier/) et tu analyses son contenu pour avoir tous les fichiers à récupérer.
Si tu ne peux pas voir la liste du dossier, à moins d'avoir un accès FTP il ne t'es pas possible de récupérer les fichiers dont le nom n'est pas connu.
Marsh Posté le 08-09-2004 à 00:11:18
Non mais je parle pas du TWebBrowser je parle du TIdHttp, et avec le TIdHttp je veux télécharger tout les fichiers d'un dossier, et je suis obliger de télécharger avec le TIdHttp, car le logiciel que je fais c'est un systèmes de mise à jours de logiciels pour tout les programmeurs.
Marsh Posté le 08-09-2004 à 00:21:33
J'ai pas parlé du TWebBrowser.
Mais le TIdHttp est un client HTTP comme n'importe quel browser web (IE, Mozilla, ...). Je ne parle pas de l'affichage mais de la récupération des fichiers/pages.
Si le browser web ne peut pas voir le contenu d'un dossier, le TIdHttp ne pourra pas non plus.
Marsh Posté le 08-09-2004 à 00:23:48
Ha donc la sa me pose problème, tu n'as pas une idée ?
Marsh Posté le 08-09-2004 à 00:24:59
Une idée ? Techniquement c'est impossible d'avoir la liste des fichiers de la racine via HTTP si le serveur ne te la donne pas quand tu tappes www.monsite.com
Si le serveur t'envoie une page (index.html par exemple), tout le contenu du dossier est "secret".
Marsh Posté le 08-09-2004 à 00:27:47
Oui mais justement c'est un dossier avec seulement des fichier .exe .zip .rar .dll ou autres mais pas de pages web, c'est genre : 'http://www.monsite.com/Lenomdulogiciel/etlalesfichiers'
Marsh Posté le 08-09-2004 à 00:34:19
Si c'est un dossier juste pour ça, si le serveur le permet et qu'il n'y a pas de page d'index tu dois pouvoir en avoir la liste.
Tu downloades http://www.monsite.com/Lenomdulogiciel/etlalesfichiers avec le TIdHttp. Ça te renvoie un fichier texte : une page HTML contenant les liens vers les fichiers. De cette page tu extrais tous les liens pour avoir la liste des fichiers. Ce n'est pas automatique ; tu dois faire ça manuellemement.
Marsh Posté le 08-09-2004 à 00:35:26
A et tu peu m'expliquer comment fair stp ?
Merci d'avance.
Marsh Posté le 08-09-2004 à 00:36:56
s := IdHttp1.Get('http://www.monsite.com/Lenomdulogiciel/etlalesfichiers');
puis tu fais une boucle, tu cherches un 'href="', tu prends ce qui suit jusqu'au '"' suivant, etc.
Je vais pas taper le code à ta place
Tu fais l'essai en sauvant dans un fichier ce que te renvoie le Get de l'URL, puis tu ouvres ce fichier avec un éditeur texte.
Comme ça tu verras exactement ce que ton programme doit chercher.
Marsh Posté le 08-09-2004 à 00:39:50
Non mais je voie tres bien comment fair mais c'est de recuperer que je voulais savoir comment fair en code.
Marsh Posté le 08-09-2004 à 00:41:15
Là par contre je ne comprends pas ce que tu veux dire...
Marsh Posté le 08-09-2004 à 00:43:10
Non j'ai une meilleur idee, est-il possible de mettre un fichier ini avec tout les liens des fichiers dedans et de fair telecharger avec le idhttp tout les liens du fichier ini.
Marsh Posté le 08-09-2004 à 00:44:26
Bah oui.
Tu parcours la liste des liens du Ini (GetSectionValues ou un truc du genre, une des méthodes de TIniFile/TMemIniFile) et pour chaque item de la liste tu fais un Get.
Marsh Posté le 08-09-2004 à 00:46:26
Oui mais dans le prog de mise à jour y aurra pas le meme nombre de lien pour chaque personnes qui l'utilise pour son logiciel.
Marsh Posté le 08-09-2004 à 00:47:52
ReplyMarsh Posté le 08-09-2004 à 00:49:19
Je vois pas trop le problème
t'as un ini avec
[fichiers]
fichier1=http://.....exe
fichier2=http://.....zip
etc.
Avec GetSectionValues (ou un truc du genre) t'as une liste abec tout le contenu de [fichiers], il ne te reste plus qu'à prendre chaque élément de la liste (for i := 0 to liste.Count-1 etc.)
Marsh Posté le 08-09-2004 à 00:50:15
lol c'est peut etre simple pour toi mais j'ai pas beaucoup d'anner d'experience en prog.
Marsh Posté le 08-09-2004 à 00:52:37
Bah oui mais bon là c'est pas très compliqué.
Une boucle for, une TStringList, un TMemIniFile...
Si tu ne sais pas utiliser ces trucs-là tu devrais lire quelques tutoriels (www.developpez.com par exemple)
Marsh Posté le 08-09-2004 à 00:53:20
Oui je vais aller voir et merci pour ton aide.
Marsh Posté le 08-09-2004 à 21:50:12
J'ai rien trouver pour mon problème
Marsh Posté le 08-09-2004 à 21:56:12
J'ai pas dit qu'il y aurait quelque chose pour ton problème précisément, mais si tu sais utiliser une boucle for, un TStringList et un T(Mem)IniFile, les indications que j'ai données suffisent... Si tu ne sais pas utiliser ça, comme je l'ai dit sur developpez.com il doit bien y avoir des tutoriels de base.
Marsh Posté le 09-09-2004 à 06:27:02
Oui, ou des fois il ne faut pas negliger la touche F1, ca peut résoudre des fois des problemes tres rapidement...
Marsh Posté le 15-09-2004 à 18:14:40
C'est bon je l'est fini : http://benjouke.free.fr/index.php?Page=3
Marsh Posté le 19-09-2004 à 16:47:33
J'ai ajouter un système de commentaire sur mon site comme ça vous pourrez laisser vos impressions, poser vos questions et autres, je serrais la pour y répondre.
http://benjouke.free.fr/index.php?Page=7
Marsh Posté le 19-09-2004 à 18:50:05
Ouais bon ça va la pub, une fois suffit
Marsh Posté le 19-09-2004 à 19:47:51
lol, au faite ta essayer ou pas ?
Marsh Posté le 19-09-2004 à 20:26:38
ReplyMarsh Posté le 15-11-2004 à 19:34:12
Je poursuis le post parce que j'ai un problème similaire dans la mesure où j'essaye de télécharger un fichier (ça marche ) mais j'essaye d'afficher la progression du DL. J'ai essayé ce que me propose le net c'est à dire de mettre des mise à jours de l'affichage grâce au idHTTPBegin/idHTTPWork/idHTTPEnd mais ça freeze
Alors j'ai eu l'idée de faire tourner le DL dans un thread mais là, la progression se fait 32 ko par 32 ko toutes les 1 ou 2 sec alors que le fichier est DL depuis des lustres
Comprend po
Marsh Posté le 15-11-2004 à 21:26:20
Les événements tu les as raccordés à des méthodes de ton thread ou du programme principal ?
Marsh Posté le 15-11-2004 à 22:02:01
le composant idHTTP1 (c'est son nom) dont les évènements sont cités précédement est raccordés au programme principal :
TfrmMain.idHTTPBegin(...);
TfrmMain.idHTTPWork(...);
TfrmMain.idHTTPEnd(...);
edit : voici la déclaration du thread que j'ai fait :
type |
Voici le constructeur :
|
La fonction de téléchargement en question.
|
La méthode qui lance le DL...un peu hasardeux, je l'avoue
|
et là c'est la méthode qui va réinitialiser certaines valeurs et certains composants sur ma fiche..
|
Voilà, je sais pas si je suis à côté de la plaque mais j'ai d'autres softs qui fonctionnent sur ce modèle mais avec une utilisation différente. Cependant ici, du fait des évènements externe liés à la réception des données par le compo idHTTP, je ne sais pas comment je dois interagir entre le Thread et le idHTTP.
Un conseil ?
Marsh Posté le 16-11-2004 à 00:13:44
Tu es en partie à côté de la plaque (enfin je pense ) parce que si tu downloades dans le synchronise tu perds tout l'intérêt du thread il me semble.
Le synchronize ne sert qu'à faire un "lien" avec l'interface graphique (avec d'autres threads en fait).
Donc dans le synchronize tu mets tout ce qui modifie l'interface de la form ou qui affiche des trucs (message box, etc.)
mais le Get lui-même ne doit pas être appelé dans le synchronize.
Pour le Execute ça serait un truc genre :
with frmMain.IdHTTP1 do // tant qu'on utilise des trucs non-visuels de la form ça doit passer |
Les trucs avec LastError sont évidemment à rajouter.
Pour la fin du thread, tu dois relier le OnTerminate du thread à une procédure de ta Form qui va alors faire ce qu'il faut quand c'est fini, ce n'est pas le thread qui doit s'interrompre.
Pour la progression, soit tu le mets dans un synchronize (dans mon soft la progression ressemblait à ça :
procedure TDownloadThread.httpWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); |
), soit tu relies le OnWork à une procédure de la form (je pense, pas testé )
J'espère que je ne me suis pas planté sur ce coup-là
Marsh Posté le 20-11-2004 à 02:42:26
Yop antp, j'ai un phénomène trop chelou qui se déroule là :
Observe ceci :
Code :
|
Il n'y a aucun Synchronize et ça fonctionne. Normalement, si je suis tes conseils et ceux de la doc, il faut mettre les procedure qui modifie l'interface du programme dans Synchronize pour évité le partage en cacahuètes...Or ici c'est exactement l'inverse. Si je mets Synchronize(Affiche), et bien le soft freeze pendant l'exécution du thread et se débloque à la fin...comprends pu rien moi
Marsh Posté le 20-11-2004 à 12:55:02
Bah normal que ça freeze : t'as vu la taille de ta boucle ? y a rien dans ton thread... le but du thread c'est de faire des opérations lourdes à part. Ici la seule opération que tu fais est dans l'interface donc inutile.
Et le fait que ça ne plante pas, c'est un coup de bol et aussi peut-être dû au fait que la seule chose que fait ton thread c'est toucher à l'interface...
Marsh Posté le 21-11-2004 à 02:59:16
le coup de la boucle c'était pour tester justement.
En temps normal, une telle boucle dans le log doit le faire freezer or là dans le thread et sans le Synchronize ça ne freeze po.
Dans ce que je compte faire, il y'aura un peu (beaucoup) plus de boulot, maniement de flux de fichier etc, mais c'était juste pour tester si le thread fonctionne. Et là, ça me turlupine. Avec le synchronize, ça freeze et sans ça freeze pas...
Marsh Posté le 21-11-2004 à 14:49:51
Benh tu dois faire le synchronize à chaque update du compteur, pas foutre la boucle dans le synchronize. Mais évidemment si le temps de mise à jour du label est plus long que le temps de traitement d'un item, le synchronize semblera "bloquer" vu qu'il devra à chaque fois attendre cette mise à jour.
Mais je t'assure que sans synchronize ça plantera s'il y a plus dans la boucle et/ou sur d'autres machines selon leurs performances et leur charge.
Marsh Posté le 21-11-2004 à 14:58:35
ok, donc la procedure qui devra effectuer le traitement devra être appelée avec Synchronize dans la méthode Execute de mon thread. Je vais faire ça :-)
Merki. Je reviens foutre mon bordel si ça marche pas hein
Marsh Posté le 21-11-2004 à 15:08:39
non, le traitement est pas dans le synchronize (enfin, ça dépend ce qu'on appelle traitement aussi...)
Dans le synchronize tu mets tout ce qui touche à des éléments partagés avec le thread principal (donc en gros toute l'interface graphique utilisant la VCL)
Marsh Posté le 22-11-2004 à 19:50:08
pour info voici ce que j'ai trouvé en cherchant comment récupérer un fichier internet :
http://delphi.developpez.com/faq/?page=indy_idhttp
il y a un peu tout :
comment telecharger un fichier, faire une progressabr pdt le transfert, afficher la vitesse de telechargement ...
Marsh Posté le 22-11-2004 à 23:08:00
mon travail s'est basé sur leur précieux conseils mais ça ne fonctionne pas du tout chez moi
Marsh Posté le 07-09-2004 à 23:34:51
Salut à tous,
Voila je voudrais savoir comment télécharger tout les fichiers d'un dossier avec le composant IdHTTP.
Pour le moment j'ai seulement réussie à télécharger un fichier précis en faisant :
Merci d'avance.
---------------
Référencement par http://www.logicielreferencement.com