-
[FTP] Reprise sur erreur
Bonjour,
mon objectif est de télécharger sur mon serveur un fichier via FTP.
J'ai vu qu'il y avait quelques API (FTP4J, common net de apache, classes utilitaire de java etc) de disponible.
Mais je ne trouve pas dans les docs de ces API comment faire une reprise sur erreur. Par exemple dans le cas où j'ai une coupure réseau et que je n'ai pas pu télécharger qu'une partie du fichier, je voulais savoir comment faire pour récupérer le reste du fichier. Quand don utilise un client FTP on voit souvent des fichiers avec des extensions filepart, je voudrais reproduire un comportement similaire
Si vous avez une idée d'API qui sache faire ça je suis preneur ...
merci
-
Salut,
La méthode download de FtpClient de FTP4J à un paramètre restartAt (Avec Apache FTP, il y a setRestartOffset()).
Ensuite l'algo est assez simple :
à chaque téléchargement de fichier (mettons truc.machin pour l'exemple)
- tu enregistres dans un fichier partialdownload (par exemple), se trouvant dans le dossier de destination, le nom du fichier (donc truc.machin), associé aux informations de la source (emplacement distant, nom, url, etc... tout ce qui te permettra de redémarrer un téléchargement).
- ensuite, tu lances le téléchargement du fichier vers truc.machin.filepart
- à la fin du téléchargement, tu supprimes le fichier truc.machin déjà éventuellement présent (ou tu le renommes en .bak pour encore plus de sécurité), tu renommes truc.machin.filepart en truc.machin et tu supprimes les informations de truc.machin du fichier partialdownload (et tu supprimes le .bak le cas échéant)
Lorsqu'on relance l'appli, tu lis le fichier partialdownload et le parcourt : il contient tous les noms de fichiers qui n'ont pas aboutis. S'il existe un .filepart correspondant, tu relances le téléchargement (la taille du fichier est l'offset de restart). S'il n'en existe pas, c'est que le plantage à eu lieu non pas pendant le téléchargement, mais dans ton application (avant de démarrer le téléchargement, ou après avoir renommer à la fin).
Tu peux simplifier si ton utilitaires de téléchargement télécharge toujours depuis la même source (même serveur ftp) et sans changer le nom du fichier (même nom local et distant) : dans ce cas, le .filepart est suffisant pour avoir toutes les informations, et au relancement de l'application de téléchargement, il suffit de chercher tous les .filepart situés dans le dossier local (il y a éventuellement un problème si le fichier distant porte l'extension filepart, mais dans ce cas le fichier qui semble être celui d'origine n'existe pas dans la source, donc il suffit d'ignorer les .filepart qui n'ont pas/plus de source).
-
Salut
ok merci pour l'info
J'essaie d'implémenter ça et je te redis
Par expérience tu recommandes quelle API ?
Merci encore
-
j'ai essayé avec FTP4J l'implémentation est simple surtout en implémentant le listener de l'interface FTPDataTransferListener
merci
-
Juste pour partager l’expérience avec ceux qui ont galéré sur un problème de reprise. Il faut analyser les commandes FTP échangées entre votre client et votre serveur (avec Wireshark par exemple)
Dans le cas du serveur FTP free la reprise ne fonctionne pas avec FTP4J car la librairie envoies la commande REST qui permet de recommencer à partir d'un point spécifique.
Il faut donc trouver une solution alternative