téléchargement de fichier

wiskywisky Membre
18:51 modifié dans API AppKit #1
Comment faire pour télécharger un fichier et l'enregistrer sur le disque dur.
Il faut que je puissent récuperer les informations sur le fichier (taille) avant le début du téléchargement pour permettre le suivi du téléchargement. Il faut que les protocoles HTTP et FTP soit suportés.

Mais pour commencer comment ont fait pour télécharger? :why?:

Réponses

  • 18:51 modifié #2
    Tu peux charger un "petit" fichier depuis les méthodes ...ContentsOfURL comme par exemple :
    [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.apple.com"]]

    Pour le téléchargement de "gros" fichiers (gestionnaire) tu peux utiliser NSURLDownload bout d'exemple : http://www.objective-cocoa.org/forum/index.php?topic=937.0
  • wiskywisky Membre
    18:51 modifié #3
    Merci pour les infos ;)

    il ne montre que le code pour la progression. Je test ;)
  • wiskywisky Membre
    18:51 modifié #4
    bon, j'ai un souci!

    Je n'arrive pas à  comprendre comment ça marche. Il faut que j'utilise NSURLDownload ou NSURLResponse?
    Quel est la différence?

    Pour lancer le téléchargement je doit utilisé quoi? :why?:
  • fouffouf Membre
    18:51 modifié #5
    Regarde ca aussi , ya des choses qui peuvent être intéressantes.
    http://objective-cocoa.org/index.php?p=ressource_detail&id=9
  • BruBru Membre
    18:51 modifié #6
    dans 1123658578:

    Pour lancer le téléchargement je doit utilisé quoi? :why?:


    Voici un exemple qui a fonctionné chez moi :

    [tt]
    {
        NSURL *url;
        NSURLRequest *req;
        NSURLDownload *dl;

        url=[NSURL URLWithString:@"ftp://ftp.apple.com/developer/!_About_Dev_Connection_ftp.txt"];
        req=[NSURLRequest requestWithURL:url
                          cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:5];

        dl=[[NSURLDownload alloc] initWithRequest:req delegate:self];

        if (dl) [dl setDestination:@/texte.txt allowOverwrite:YES];

    }
    [/tt]

    .
  • wiskywisky Membre
    18:51 modifié #7
    dans 1123660129:

    Regarde ca aussi , ya des choses qui peuvent être intéressantes.
    http://objective-cocoa.org/index.php?p=ressource_detail&id=9

    je l'ai déjà  et ça m'aide pour tester la connexion.

    Merci Bru. Je comprend mieux maintenant. ;)
  • wiskywisky Membre
    18:51 modifié #8
    J'ai une erreur
    signal 11 (SIGSEGV)
    


    Le téléchargement est lancé par un message dans ma class:
    -(void)runDownload:(NSNotification *)notif<br />{<br />	NSString *URLFile = [notif object];<br />	NSLog(@&quot;%@&quot;,URLFile);<br />	url=[NSURL URLWithString:URLFile];<br />	req=[NSURLRequest requestWithURL:url<br />					 cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60];<br /><br />	dl=[[NSURLDownload alloc] initWithRequest:req delegate:self];<br />	NSLog(@&quot;%@&quot;,[NSString stringWithFormat:@&quot;%@/file1.zip&quot;,NSTemporaryDirectory()]);<br />	if (dl) [dl setDestination:[NSString stringWithFormat:@&quot;%@/file1.zip&quot;,NSTemporaryDirectory()] allowOverwrite:YES];<br />}
    

    j'ai bien les deux NSLog qui s'affiche dans la console. Après il plante :'(
  • fouffouf Membre
    18:51 modifié #9
    Regarde avec le debugger dans quelle méthode il plante exactement.
    En plus, tu n'as pas besoin de tester dl, puisque si tu as dl==nil, le message sera envoyé à  rien du tout.
  • wiskywisky Membre
    août 2005 modifié #10
    Le debuger me répond ça:

    [tt]2005-08-10 13:13:53.248 xNetUpdate[760] http://www.monsite.com/u/f.zip
    Program received signal:  "EXC_BAD_ACCESS".
    2005-08-10 13:13:53.299 xNetUpdate[760] /private/var/tmp/folders.501/TemporaryItems/file1.zip

    Unable to disassemble objc_msgSend_rtp.
    (gdb) [/tt]

    comment faire pour tester si le fichier existe bien?
  • BruBru Membre
    18:51 modifié #11
    A tout hasard, fais un retain sur req (mais je n'y crois pas trop car dans la doc, il est dit que l'objet NSURLRequest est copié avant d'être utilisé par NSURLDownload).

    D'autre part, il est important que le delegate (ici self) soit aussi présent pendant le transfert (s'il est purgé, alors plantage).

    Enfin, la doc précise qu'il y a des restrictions en multi-thread... Utilises tu plusieurs threads ?

    .
  • wiskywisky Membre
    août 2005 modifié #12
    dans 1123672592:

    Enfin, la doc précise qu'il y a des restrictions en multi-thread... Utilises tu plusieurs threads ?

    non
    dans 1123672592:

    A tout hasard, fais un retain sur req (mais je n'y crois pas trop car dans la doc, il est dit que l'objet NSURLRequest est copié avant d'être utilisé par NSURLDownload).

    même résultat
  • BruBru Membre
    18:51 modifié #13
    Pour moi, le problème peut avoir de multiples causes :

    1- url est il bien créé ? (fais un [tt]NSLog(@%@';, url);[/tt] après URLWithString).

    2- req est il bien créé ? (idem, un [tt]NSLog(@%@';, req);[/tt] après requestWithURL).

    .
  • wiskywisky Membre
    18:51 modifié #14
    Tout ce créé correctement:

    [tt]2005-08-10 13:44:04.748 xNetUpdate[842] http://www.monsite.com/u/f.zip
    2005-08-10 13:44:04.749 xNetUpdate[842] http://www.monsite.com/u/f.zip
    2005-08-10 13:44:04.749 xNetUpdate[842] <NSURLRequest http://www.monsite.com/u/f.zip>;
    2005-08-10 13:44:04.805 xNetUpdate[842] /private/var/tmp/folders.501/TemporaryItems/file1.zip
    2005-08-10 13:44:04.806 xNetUpdate[842] OK[/tt]

    J'ai l'impression qu'il est libéré trop top.
    J'ai un outlet entre les 2 classes. Mais je ne l'utilise pas. J'envoi un message et puis plus rien après.
    [[NSNotificationCenter defaultCenter] postNotificationName:@&quot;DownloadGo&quot; object:[dic objectForKey:@&quot;url&quot;]];
    

    Le message "DownloadGo" lance la methode "runDownload".
    J'ai du oublié une partie?
  • wiskywisky Membre
    18:51 modifié #15
    J'ai remplacé le message par le passage par l'outlet:
    [Telechar init]; <br />	[Telechar runDownload:[dic objectForKey:@&quot;url&quot;]];
    

    Telechar est le nom de l'outlet sur lequel est connecter ma class via IB.

    Le résultat est "signal 10 (SIGBUS)". J'ai une alerte comme quoi "runDownload" n'existe pas. mais lors de l'exécution il la trouve B)
  • BruBru Membre
    18:51 modifié #16
    dans 1123675255:

    J'ai une alerte comme quoi "runDownload" n'existe pas. mais lors de l'exécution il la trouve


    Tu as simplement dû oublier de déclarer runDownload: dans le .h de ta classe. Mais comme objC est dynamique, ça n'empêche pas l'exécution du programme par la suite.

    dans 1123675255:

    J'ai remplacé le message par le passage par l'outlet:
    [Telechar init]; <br />	[Telechar runDownload:[dic objectForKey:@&quot;url&quot;]];
    

    Telechar est le nom de l'outlet sur lequel est connecter ma class via IB.
    Le résultat est "signal 10 (SIGBUS)".


    Ceci est peu être normal : dans la décla de runDownload:, le paramètre est une notif NSNotification, or tu appelles cette méthode avec un paramètre qui ne semble pas être NSNotification (mais plutôt NSString).

    .
  • wiskywisky Membre
    août 2005 modifié #17
    Voici du nouveau.
    ma fonction est bien déclaré dans mon fichier .h
    maintenant il continue à  planté mais il ne me fait plus d'erreur.

    Voici le rapport de plantage de Mac Os X.4.2:
    [tt]Date/Time:      2005-08-11 14:44:41.308 +0200
    OS Version:     10.4.2 (Build 8C46)
    Report Version: 3

    Command: xNetUpdate
    Path:    /xNetUpdate/build/Release/xNetUpdate.app/Contents/MacOS/xNetUpdate
    Parent:  WindowServer [68]

    Version: ??? (1.99b2)

    PID:    1116
    Thread: 0

    Exception:  EXC_BAD_ACCESS (0x0001)
    Codes:      KERN_INVALID_ADDRESS (0x0001) at 0x656d6963

    Thread 0 Crashed:
    0   <<00000000>> 0xfffeff20 objc_msgSend_rtp + 32
    1   com.apple.Foundation      0x92859708 NSPopAutoreleasePool + 536
    2   com.apple.AppKit          0x93628414 -[NSApplication run] + 544
    3   com.apple.AppKit          0x93718c1c NSApplicationMain + 452
    4   com.apple.xNetUpdate2    0x0000227c _start + 344 (crt.c:272)
    5   com.apple.xNetUpdate2    0x00002120 start + 60

    Thread 1:
    0   libSystem.B.dylib        0x9004ca38 syscall_thread_switch + 8
    1   com.apple.Foundation      0x92895330 +[NSThread sleepUntilDate:] + 152
    2   com.apple.AppKit          0x936c8e60 -[NSUIHeartBeat _heartBeatThread:] + 1100
    3   com.apple.Foundation      0x9287cf34 forkThreadForFunction + 108
    4   libSystem.B.dylib        0x9002c3d4 _pthread_body + 96

    Thread 2:
    0   libSystem.B.dylib        0x9000a778 mach_msg_trap + 8
    1   libSystem.B.dylib        0x9000a6bc mach_msg + 60
    2   com.apple.CoreFoundation 0x9074b3d8 __CFRunLoopRun + 832
    3   com.apple.CoreFoundation 0x9074acdc CFRunLoopRunSpecific + 268
    4   com.apple.Foundation      0x928a43e0 +[NSURLConnection(NSURLConnectionInternal) _resourceLoadLoop:] + 264
    5   com.apple.Foundation      0x9287cf34 forkThreadForFunction + 108
    6   libSystem.B.dylib        0x9002c3d4 _pthread_body + 96

    Thread 3:
    0   libSystem.B.dylib        0x9001efec select + 12
    1   com.apple.CoreFoundation 0x9075dc6c __CFSocketManager + 472
    2   libSystem.B.dylib        0x9002c3d4 _pthread_body + 96

    Thread 4:
    0   libSystem.B.dylib        0x9000a778 mach_msg_trap + 8
    1   libSystem.B.dylib        0x9000a6bc mach_msg + 60
    2   com.apple.CoreFoundation 0x9074b3d8 __CFRunLoopRun + 832
    3   com.apple.CoreFoundation 0x9074acdc CFRunLoopRunSpecific + 268
    4   com.apple.Foundation      0x928a5520 +[NSURLCache _diskCacheSyncLoop:] + 152
    5   com.apple.Foundation      0x9287cf34 forkThreadForFunction + 108
    6   libSystem.B.dylib        0x9002c3d4 _pthread_body + 96

    Thread 0 crashed with PPC Thread State 64:
      srr0: 0x00000000fffeff20 srr1: 0x000000000000d030                        vrsave: 0x0000000000000000
        cr: 0x44000224          xer: 0x0000000000000004   lr: 0x0000000092859708  ctr: 0x0000000000000001
        r0: 0x0000000000000001   r1: 0x00000000bffff1f0   r2: 0x00000000656d6963   r3: 0x000000000036f460
        r4: 0x0000000090a16918   r5: 0x000000000000000c   r6: 0x000000000036f461   r7: 0x000000000000bdf0
        r8: 0x0000000000000001   r9: 0x000000000000a000  r10: 0x0000000000000de8  r11: 0x000000006f5f6918
       r12: 0x00000000003c0d2b  r13: 0x0000000000000000  r14: 0x0000000000000000  r15: 0x0000000000000000
       r16: 0x0000000000000000  r17: 0x0000000000000000  r18: 0x0000000000000000  r19: 0x0000000000000000
       r20: 0x0000000000000000  r21: 0x0000000000000000  r22: 0x0000000000000000  r23: 0x0000000000000000
       r24: 0x0000000000000000  r25: 0x0000000000000000  r26: 0x0000000000000000  r27: 0x00000000a3668824
       r28: 0x0000000090a191a0  r29: 0x000000000036f460  r30: 0x00000000a3624078  r31: 0x0000000092859504

    <EDIT>//JE fait un peut de ménage pour éviter d'abà®mer le site ;)</edit>

    Model: PowerBook4,3, BootROM 4.6.4f1, 1 processors, PowerPC 750  (2.3), 900 MHz, 640 MB
    Graphics: ATI Mobility Radeon 7500, ATY,RageM7, AGP, 32 MB
    Memory Module: DIMM0/BUILT-IN, 128 MB, built-in, built-in
    Memory Module: DIMM1/J12, 512 MB, SDRAM, PC133U-333
    AirPort: AirPort, 9.52
    Modem: MicroDash, Euro, V.92, 1.0F, APPLE VERSION 2.6.6
    Network Service: Ethernet intégré, Ethernet, en0
    Parallel ATA Device: Hitachi IC25N040ATMR04-0, 37.26 GB
    Parallel ATA Device: SONY CD-RW/DVD-ROM CRX820E,
    USB Device: USB Mouse, Logitech, Up to 1.5 Mb/sec, 500 mA
    [/tt]
  • wiskywisky Membre
    18:51 modifié #18
    bon, je n'avance plus et je n'y comprend plus rien. :'(

    voici les fichiers de ma classe DownLoad qui doit me permettre de télécharger un fichier.

    et voici dans mon fichier qui demande le lancement du téléchargement:

    Dans le fichier .h du fichier demandant le téléchargement:
    IBOutlet id Telechar; //la classe DownLoad est lié via IB
    



    En debut de fichier après les autre #import:
    #import &quot;DownLoad.h&quot;
    


    puis la fonction lié à  l'action sur le bouton télécharger:
    - (IBAction)telecharge:(id)sender {<br />	NSEnumerator *enomerator = [myArray objectEnumerator];<br />	id object;<br />	NSMutableArray *tempArray = [NSMutableArray array];<br />	<br />	[enomerator autorelease];<br />	[tempArray autorelease];<br />	<br />	/* Recherche des mise à  jour a installer */<br />	while( (object = [enomerator nextObject]) ){<br />		[etats setStringValue:[NSString stringWithFormat:NSLocalizedStringFromTable(@&quot;LecApp&quot;, @&quot;Localizable&quot;, @&quot;A comment&quot;),[object objectForKey:@&quot;nomproduit&quot;]]];<br />		if([[object objectForKey:@&quot;recommander&quot;] isEqualToNumber:[NSNumber numberWithBool:YES]]) [tempArray addObject:object];<br />	}<br />	NSDictionary *dic = [tempArray objectAtIndex:0];<br />	[dic autorelease];<br />	[Telechar runDownload:[dic objectForKey:@&quot;url&quot;]];<br />	<br />	NSLog(@&quot;Telechar : %@&quot;,Telechar);<br />	[NSThread sleepUntilDate:[[NSDate date] addTimeInterval:1.0f]];<br />}<br />
    


    :why?:

    [Fichier joint supprimé par l'administrateur]
  • ChachaChacha Membre
    18:51 modifié #19
    Y'a un beau bug dans ce code (plantogène)

    <br />[enomerator autorelease];&lt;--- OUILLE OUILLE OUILLE<br />[tempArray autorelease];&lt;--- OUILLE OUILLE OUILLE<br />[dic autorelease];&lt;--- OUILLE OUILLE OUILLE<br />
    


    Tes objets enomerator, tempArray et dic te sont "donnés" par des méthodes qui ne sont PAS des initXXX ni un copy ni un retain. Donc, ce n'est PAS à  toi de les libérer.
    Tu peux tout simplement virer ces trois lignes, ces objets sont déjà  garantis d'être autoreleasés. (t'avais pas des "multiple free" dans ta console, par hasard ?)

    +
    Chacha
  • wiskywisky Membre
    18:51 modifié #20
    dans 1123837471:

    Y'a un beau bug dans ce code (plantogène)

    <br />[enomerator autorelease];&lt;--- OUILLE OUILLE OUILLE<br />[tempArray autorelease];&lt;--- OUILLE OUILLE OUILLE<br />[dic autorelease];&lt;--- OUILLE OUILLE OUILLE<br />
    


    Tes objets enomerator, tempArray et dic te sont "donnés" par des méthodes qui ne sont PAS des initXXX ni un copy ni un retain. Donc, ce n'est PAS à  toi de les libérer.
    Tu peux tout simplement virer ces trois lignes, ces objets sont déjà  garantis d'être autoreleasés. (t'avais pas des "multiple free" dans ta console, par hasard ?)

    +
    Chacha

    Bon il ne plante plus, Merci <3 Je suis trop nul :'( <br />
    Bon il ne télécharge pas plus mais je sais que le serveur répond. Il ne va pas plus loin. Je cherche...
  • wiskywisky Membre
    18:51 modifié #21
    Je vient enfin de comprendre. Maintenant il télécharge et indique bien son état.

    Un grand merci à  tous <3 <3 <3 <3 <3 <3
Connectez-vous ou Inscrivez-vous pour répondre.