10
votes

Apache Commons Net FTP FTP télécharger des fichiers corrompus

J'essaie d'utiliser Apache Commons Net pour les transferts de fichiers FTP.

Problème est des fichiers arrivant par intermittence sur le serveur corrompu. Par "corrompu", je veux dire que Winrar me dit qu'un fichier zip a une "fin inattendue des archives" . Parfois, les fichiers sont complètement vides. J'ai remarqué que cela se produit plus pour les fichiers plus importants (100 kb +), cependant cela se produit aussi pour les petits fichiers (20 Ko).

Je sais pour un fait que le fichier zip source étant téléchargé est valide et est seulement 243kb.

Je n'ai aucune erreur / exceptions à partir du code.

Voici le code étant exécuté: xxx

et Quelques journaux: xxx

Notez que toutes ces personnes étaient terminées dans les 15 secondes, et tous les fichiers résultants du serveur sont corrompus.

J'ai également testé sans régler aucun délai et le problème survient toujours.


0 commentaires

3 Réponses :


20
votes

Commons FTP par défaut des types de fichiers ASCII. Vous souhaitez la définir sur binaire lors de la gestion des données binaires comme un fichier zip.

de http: // communications. apache.org/net/api/org/apache/comment/net/ftp/ftpclient.html

Les paramètres par défaut pour FTPClient sont pour utiliser ftp.ascii_file_type, ftp.non_print_text_format, ftp.stream_transfer_mode et ftp.file_structure. Les seuls types de fichiers directement pris en charge sont FTP.ASCII_FILE_TYPE et FTP.BINARY_FILE_TYPE.

Vous voulez faire setFileType (ftp.binaire_file_type) avant d'envoyer le fichier.


2 commentaires

Assurez-vous de ftpclient.setfileType (ftp.binaire_file_type) Après une méthode de connexion, car Connect () réinitialisera le type à ftp.ascii_file_type .


Non seulement après Connect, Il doit aller après Connexion , voir Apache Java FTP Client Ne bascule pas en mode de transfert binaire sur certains serveurs .



0
votes

J'ai eu ce problème malgré la spécification du type de fichier binaire code> donc j'ai écrit le code pour valider le fichier téléchargé via MD5 code> hachage: xxx pre>

MD5Checksum.java Code>: P>

import java.io.*;
import java.security.MessageDigest;

public class MD5Checksum
{
    private static byte[] createChecksum(String filename) throws Exception
    {
        try (InputStream fileInputStream = new FileInputStream(filename))
        {
            byte[] buffer = new byte[1024];
            MessageDigest complete = MessageDigest.getInstance("MD5");
            int numRead;

            do
            {
                numRead = fileInputStream.read(buffer);
                if (numRead > 0)
                {
                    complete.update(buffer, 0, numRead);
                }
            } while (numRead != -1);

            return complete.digest();
        }
    }

    public static String getMD5Checksum(String filename) throws Exception
    {
        byte[] checksum = createChecksum(filename);
        StringBuilder result = new StringBuilder();

        for (byte singleByte : checksum)
        {
            result.append(Integer.toString((singleByte & 0xff) + 0x100, 16).substring(1));
        }

        return result.toString();
    }
}


0 commentaires

2
votes

Solution

J'ai eu le même problème et je l'ai résolu en appelant xxx

avant chaque méthode retrievefile , retrievefileStream , storefile

explication

fichier est corrompu, car le type de fichier par défaut est ftp.ascii_file_type . Cela provoque le problème. Si vous êtes sur Linux, tous les octets \ n \ r (la fin de fichier Windows du fichier) sont modifiés en octets \ n . Et cela corrompre le fichier.

Pour éviter ce problème, vous devez appeler ftpclient.setfileType (ftp.binaire_file_type) . Malheureusement, cette configuration est réinitialisée par chaque Méthode Retour à ASCII_FILE_TYPE . Dans mon cas, cela a été réinitialisé même par méthode listfiles . Je suppose que cela s'est passé parce que j'utilise passivemode sur ftpclient.

Donc, si vous voulez éviter les problèmes Call SetFileType (ftp.binaire_file_type) Juste avant chaque transfert de fichier .


3 commentaires

BTW: Désolé, mais je dois le dire: ce comportement de «Apache Commons Net FTP» est vraiment terrible.


Le mode (au moins avec certains serveurs FTP) réinitialise avec Connexion , donc SetFileType doit être appelé après le . En général, il ne réinitialise pas avec listfiles , bien qu'il soit possible que votre serveur FTP particulier. La bibliothèque nette Apache Commons elle-même ne réinitialise jamais le mode seul.


Merci - Bon point - Je me souviens que cet appel setfileType après que la connexion n'était pas suffisante dans mon cas. Et vous avez raison, que ce problème est probablement causé par le serveur et non par la bibliothèque clientèle.