web-dev-qa-db-fra.com

FTPClient - Java, télécharger un fichier

J'essaie de faire un téléchargement de fichier TRÈS simple. Je veux un Java FTPClient qui peut télécharger n'importe quel fichier auquel je le dis. Mais le pdf est toujours tout foiré et mon éditeur de pdf (Adobe) ne l'ouvrira pas, disant qu'il y a un I/O erreur.

J'utilise la classe suivante:

    import org.Apache.commons.net.ftp.FTPClient;
    ....

    FTPClient client = new FTPClient();
    FileInputStream fis = null;

    try {
        client.connect("mydomain.com");
        client.login("user", "password");

        String filename = "myPDF.pdf";
        fis = new FileInputStream(filename);

        client.storeFile("temp.pdf", fis);
        fis.close();
        client.logout();
    } catch (IOException e) {
        e.printStackTrace();
    }

Pourquoi cela ne fonctionne-t-il pas et comment le corriger?

25
CodeGuy

Cela ne fonctionne pas car le mode de transfert par défaut pour FTPClient est FTP.ASCII_FILE_TYPE. Il vous suffit de mettre à jour la configuration pour transférer en mode binaire.

26
An̲̳̳drew

Ajoutez ceci à votre fichier

ftp.setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE);
ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE);

J'ai eu le même problème avec les fichiers xlsx et c'était une bonne solution.

24
Stevan Buzejic

On oublie souvent que FTP a deux modes de fonctionnement - un pour les fichiers texte et l'autre pour les fichiers binaires (image). Dans le bon vieux temps, en se connectant à partir d'un client ftp en ligne de commande, nous nous souviendrions soigneusement de définir le mode de transfert avant de demander un fichier - ou nous rencontrerions exactement le type de problème que vous semblez avoir. Aujourd'hui, beaucoup de situations semblent par défaut en binaire, mais apparemment pas la vôtre.

Vous devrez probablement dire à votre implémentation ftp de transférer en mode binaire/image.

9
Chris Stratton

Essayez d'utiliser BufferedInputStream , ceci est un exemple de code (fonctionnel):

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
res = client.storeFile("File Name", bis);
bis.close();
client.logout();
3
MByD

De documentation

Cette méthode ne ferme PAS le InputStream donné.

Fermez donc FileInputStream avant d'appeler logout()

2
Bala R

Pour moi, seul ftp.setFileType (FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE) a fonctionné, alors que lorsque j'utilisais ftp.setFileTransferMode (FTP.BINARY_FILE_TYPE), le fichier était corrompu.

1
Swarit Agarwal

Essaye ça.

objFtpClient.setFileType(FTP.BINARY_FILE_TYPE);

objFtpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);

objFtpClient.enterLocalPassiveMode();
1
JK Patel

Cela ressemble à n bogue dans la bibliothèque Commons NET , qui a affecté la version 3.0. Essayez une version plus récente (3.0.1), qui a corrigé le bogue.

0
Paŭlo Ebermann