Comment télécharger tout les fichiers d'un dossier avec le IdHTTP ?

Comment télécharger tout les fichiers d'un dossier avec le IdHTTP ? - Delphi/Pascal - Programmation

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 :  
 

Code :
  1. var
  2. LesFichiers: TFileStream;
  3. begin
  4. LesFichiers := TFileStream.Create('lefichier.exe',FmCreate);
  5. IdHTTP1.Get(http://www.monsite.com/lefichier.exe,LesFichiers);
  6. LesFichiers.Free;
  7. end;


 
Merci d'avance.


---------------
Référencement par http://www.logicielreferencement.com
Reply

Marsh Posté le 07-09-2004 à 23:34:51   

Reply

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.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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.


---------------
Référencement par http://www.logicielreferencement.com
Reply

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.


Message édité par antp le 08-09-2004 à 00:22:23

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 08-09-2004 à 00:23:48    

Ha donc la sa me pose problème, tu n'as pas une idée ?


---------------
Référencement par http://www.logicielreferencement.com
Reply

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".


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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'


---------------
Référencement par http://www.logicielreferencement.com
Reply

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.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 08-09-2004 à 00:35:26    

A et tu peu m'expliquer comment fair stp ?
Merci d'avance.


---------------
Référencement par http://www.logicielreferencement.com
Reply

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 :p
 
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.


Message édité par antp le 08-09-2004 à 00:37:25

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 08-09-2004 à 00:36:56   

Reply

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.


---------------
Référencement par http://www.logicielreferencement.com
Reply

Marsh Posté le 08-09-2004 à 00:41:15    

Là par contre je ne comprends pas ce que tu veux dire...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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.


---------------
Référencement par http://www.logicielreferencement.com
Reply

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.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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.


---------------
Référencement par http://www.logicielreferencement.com
Reply

Marsh Posté le 08-09-2004 à 00:47:52    

Reply

Marsh 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.)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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.


---------------
Référencement par http://www.logicielreferencement.com
Reply

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 :p (www.developpez.com par exemple)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 08-09-2004 à 00:53:20    

Oui je vais aller voir et merci pour ton aide.


---------------
Référencement par http://www.logicielreferencement.com
Reply

Marsh Posté le 08-09-2004 à 21:50:12    

J'ai rien trouver pour mon problème :(


---------------
Référencement par http://www.logicielreferencement.com
Reply

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.


Message édité par antp le 08-09-2004 à 21:56:43

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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...

Reply

Marsh Posté le 15-09-2004 à 18:14:40    

C'est bon je l'est fini : http://benjouke.free.fr/index.php?Page=3


Message édité par seven2004 le 15-09-2004 à 18:14:50

---------------
Référencement par http://www.logicielreferencement.com
Reply

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


---------------
Référencement par http://www.logicielreferencement.com
Reply

Marsh Posté le 19-09-2004 à 18:50:05    

Ouais bon ça va la pub, une fois suffit :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 19-09-2004 à 19:47:51    

lol, au faite ta essayer ou pas ?


---------------
Référencement par http://www.logicielreferencement.com
Reply

Marsh Posté le 19-09-2004 à 20:26:38    

Reply

Marsh 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 :p) 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 [:airforceone]
 
Comprend po :(


Message édité par Inekman le 15-11-2004 à 19:34:38
Reply

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 ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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
    TWPThread = class(TThread)
    private
    protected
        procedure DownloadHTTP;
        constructor Create(CreateSuspended: Boolean);
        procedure Execute; override;
        procedure OnTerminate;
    end;


 
Voici le constructeur :
 


constructor TWPThread.Create(CreateSuspended: Boolean);
begin
    inherited Create(CreateSuspended);
 
    FreeOnTerminate := True;
    Priority := tpNormal;
 
    if CreateSuspended then
        Resume;
end;


 
La fonction de téléchargement en question.
 


procedure TWPThread.DownloadHTTP;
begin
    with frmMain.IdHTTP1 do
        try
            Port := 80;
            try
                Get('http://LeSite.com/LeFichier.fic', frmMain.LeStream);
            except
                on e: Exception do
                    MessageDlg(Format('Erreur : %s', [e.Message]), mtInformation, [mbOK], 0);
            end;
        finally
            frmMain.WPT.Terminate;
        end;
end;


 
La méthode qui lance le DL...un peu hasardeux, je l'avoue
 


procedure TWPThread.Execute;
begin
    Synchronize(DownloadHTTP);
end;


 
et là c'est la méthode qui va réinitialiser certaines valeurs et certains composants sur ma fiche..


procedure TWPThread.OnTerminate;
begin
    if Assigned(frmMain.WPT) then
        begin
            frmMain.WPT.Terminate;
            MessageBox(0, 'Finito', '0', 0);
        end;
end;


 
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 ? :hello:


Message édité par Inekman le 15-11-2004 à 22:10:29
Reply

Marsh Posté le 16-11-2004 à 00:13:44    

Tu es en partie à côté de la plaque (enfin je pense :D) 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
begin
  Port := 80;
  try
    Get('http://LeSite.com/LeFichier.fic', frmMain.LeStream);
  except
    on e: Exception do
    begin
      FLastError := e.Message
      Synchronize(ShowLastError);
    end;
  end;
end;


 
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);
begin
  FStatusText := Format('%d bytes', [AWorkCount]);
  Synchronize(SetStatus);
end;

), soit tu relies le OnWork à une procédure de la form (je pense, pas testé :D)
 
J'espère que je ne me suis pas planté sur ce coup-là :D


Message édité par antp le 16-11-2004 à 00:16:29

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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 :
  1. procedure TMonThread.Execute;
  2. begin
  3.     Affiche;
  4. end;
  5. procedure TMonThread.Affiche;
  6. var
  7.     i: integer;
  8. begin
  9.     for i := 0 to 10000 do
  10.         begin
  11.             frmSplit.lblFichier.Caption := IntToStr(i);
  12.         end;
  13.     MessageBox(frmSplit.Handle, 'fini', '', 0);
  14. end;


 
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 [:airforceone] :(


Message édité par Inekman le 20-11-2004 à 02:43:06
Reply

Marsh Posté le 20-11-2004 à 12:55:02    

Bah normal que ça freeze : t'as vu la taille de ta boucle ? :o 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...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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...

Reply

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.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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 :p

Reply

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)


Message édité par antp le 21-11-2004 à 15:08:58

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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 ...


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

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 :'(

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed