3 votes

Meilleur moyen de détecter les fichiers téléchargés en double dans un environnement Java ?

Dans le cadre d'une application Web basée sur Java, je vais accepter des fichiers .xls et .csv (et éventuellement d'autres types) téléchargés. Chaque fichier sera renommé de manière unique avec une combinaison de paramètres et un horodatage.

J'aimerais être capable d'identifier les fichiers en double. Par doublon, j'entends le même fichier, quel que soit son nom. Idéalement, j'aimerais pouvoir détecter les doublons aussi rapidement que possible après le téléchargement, de sorte que le serveur puisse inclure cette information dans la réponse. (Si le temps de traitement par taille de fichier ne provoque pas un décalage trop important).

J'ai lu qu'il était possible d'exécuter un MD5 sur les fichiers et de stocker le résultat sous forme de clés uniques, etc... mais j'ai le sentiment qu'il y a un meilleur moyen. (Y a-t-il un meilleur moyen ?)

Tout conseil sur la meilleure façon d'aborder cette question sera apprécié.

Merci.

UPDATE : Je n'ai absolument rien contre l'utilisation du MD5. Je l'ai utilisé à quelques reprises dans le passé avec Perl ( Digest::MD5 ). Je pensais que dans le monde Java, un autre ( meilleur ), une solution aurait pu émerger. Mais, il semble que je me sois trompé.

Merci à tous pour les réponses et les commentaires. Je me sens assez bien pour utiliser MD5 maintenant.

6voto

BalusC Points 498232

Pendant le traitement des fichiers téléchargés, décorer le OutputStream con un DigestOutputStream afin de pouvoir calculer le condensé du fichier pendant l'écriture. Stockez le condensé final quelque part avec l'identifiant unique du fichier (en hexadécimal dans le nom du fichier peut-être ?).

1voto

stacker Points 34209

Il vous suffit d'ajouter une méthode comme celle-ci à votre code et le tour est joué. Il n'y a probablement pas de meilleur moyen. Tout le travail est déjà fait par l'API de Digest.

public static String calc(InputStream is ) {
        String output;
        int read;
        byte[] buffer = new byte[8192];

        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256"); //"MD5");
            while ((read = is.read(buffer)) > 0) {
                digest.update(buffer, 0, read);
            }
            byte[] hash = digest.digest();
            BigInteger bigInt = new BigInteger(1, hash);
            output = bigInt.toString(16);

        } 
        catch (Exception e) {
            e.printStackTrace( System.err );
            return null;
        }
        return output;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X