2010-08-12 14 views
2

Je souhaite créer une barre de progression pour un téléchargement FTP. Le serveur sur lequel je télécharge le fichier a tous ses répertoires et fichiers cachés. Je veux afficher la progression du téléchargement. Est-il possible que je puisse obtenir la taille du fichier? Voici mon code actuel:Obtenir FileSize avant InputStream

FTPclient = new FTPClient(); 
       FTPclient.setListHiddenFiles(true); 
       FTPclient.connect(hostPart); 
       FTPclient.login(userName, passWord); 
       FTPclient.setFileType(FTP.BINARY_FILE_TYPE); 

       InputStream instream = FTPclient.retrieveFileStream(pathExcludingHostIncludingFirstSlash); 


      int l; 
      byte[] tmp = new byte[2048]; 
      int updateCounter = 0; 
      int bytesDownloaded = 0; 
      while ((l = instream.read(tmp)) != -1) { 
       fos.write(tmp, 0, l); 
       bytesDownloaded+=2048; 
       updateCounter++; 
       if(updateCounter==3){ 
        kilobytesDownloaded=(bytesDownloaded/1024); 
        publishProgress((String[])null); 
        updateCounter=0; 
       } 
+0

Votre code suppose que chaque lecture sera 2048 octets. Ce n'est pas garanti et la lecture finale ne le sera certainement pas à moins que vous n'ayez garanti que vos fichiers sont même des multiples de 2048 octets. Je recommanderais 'bytesDownloaded + = l'. –

Répondre

1

Il n'y a aucun moyen de le faire de manière fiable dans tous les services FTP. Le protocole FTP ne permet pas d'obtenir des tailles de fichier. Vous devez donc demander une liste de répertoires et décompacter le texte (spécifique au serveur) que vous récupérez. En outre, il n'y a aucune garantie que la liste de répertoires sera activée, ou que vous aurez l'autorisation de lister le répertoire. Cela dit, certaines bibliothèques FTP peuvent être configurées pour tenter d'obtenir une taille de fichier. Par exemple, avec la bibliothèque Apache FTPClient, vous pouvez (essayer) d'utiliser la méthode listFiles(String) et regarder l'objet FTPFile qui en résulte.

EDIT

Brock mentionne la @ Kevin commande SIZE FTP comme une possibilité.

  • Cette commande a d'abord été définie dans RFC 3659 en 2007. Une grande partie du logiciel serveur FTP déployé est beaucoup plus ancienne.
  • SIZE est une commande facultative; c'est-à-dire que même les serveurs compatibles RFC 3659 ne sont pas requis pour le supporter.
  • Même si TAILLE est prise en charge par un serveur, les API Apache FTPClient actuelles n'incluent pas de méthode pour obtenir la taille d'un fichier (sauf via listFiles). Bien sûr, cela pourrait changer dans le futur.
  • La classe ftp4j FTPClient apparemment fait implémenter SIZE et le rendre disponible via sa méthode fileSize(...).
+0

Le protocole FTP a la commande "SIZE" (http://www.nsftools.com/tips/RawFTP.htm#SIZE) qui est censée fournir ceci. Êtes-vous en train de dire que ce n'est pas couramment implémenté ou que les clients Java ne vous donnent pas accès à cela? –

+0

Quand donc je dois passer le chemin du fichier à listFiles? Tous les fichiers sont cachés je pense. –

+0

@Aymon - alors vous avez un problème. –

0

Je n'ai pas trouvé de commande simple pour ce faire non plus. Ma solution était d'appeler la commande skip, qui devrait retourner le nombre d'octets ignorés. Somme cela jusqu'à ce que skip renvoie 0. Il y a une possibilité que skip peut renvoyer 0 pour des raisons autres que la fin du fichier, mais sur le terrain cela semble bien fonctionner.

Voici quelques exemples de code:

InputStream checkStream = m_ftpClient.retrieveFileStream(name); 

long fileLength = 0; 
long transferredLength = 0; 
do 
{ 
    transferredLength = checkStream.skip(MAX_BYTES); 
    fileLength += transferredLength; 
}while(transferredLength > 0);