2009-01-28 7 views
3

J'ai un problème, que je ne semble pas pouvoir résoudre ... Je fais un téléchargement http d'un fichier, mais le CRC32 du fichier sur le serveur et sur le client ne correspond pas. En outre, le fichier a une taille différente, donc évidemment je dois faire quelque chose de mal ... quand je télécharge via Firefox, la taille du fichier est ok ... donc je suppose que c'est quelque part dans le code client.Java http corrompt le fichier

je l'ai déjà trouvé Corrupt file when using Java to download file, mais cela ne m'a pas aidé non plus ...

Voici le code:

private void downloadJar(String fileName, long crc32Server) throws IOException { 
    System.out.println("Downloading file '" + fileName + "' from server '" + mServer + "'."); 
    HttpURLConnection sourceConnection = null; 
    BufferedInputStream inputStream = null; 
    BufferedWriter fileWriter = null; 
    long crc32Client; 
    try { 
    URL sourceURL = new URL(fileName); 
    try { 
     sourceConnection = (HttpURLConnection)sourceURL.openConnection(); 
    } 
    catch (MalformedURLException exc) { 
     throw new RuntimeException("Configured URL caused a MalformedURLException: ", exc); 
    } 
    sourceConnection.setRequestProperty("Accept-Encoding", "zip, jar"); 
    sourceConnection.connect(); 
    inputStream = new BufferedInputStream(sourceConnection.getInputStream()); 
    fileWriter = new BufferedWriter(new FileWriter(targetFolder + File.separator + fileName)); 
    CRC32 crc32 = new CRC32(); 
    for (int singleByte = inputStream.read(); singleByte != -1; singleByte = inputStream.read()) { 
     fileWriter.write(singleByte); 
     crc32.update(singleByte); 
    } 
    crc32Client = crc32.getValue(); 
    } 
    finally { 
    if (inputStream != null) { 
     inputStream.close(); 
    } 
    if (fileWriter != null) { 
     fileWriter.flush(); 
     fileWriter.close(); 
    } 
    if (sourceConnection != null) { 
     sourceConnection.disconnect(); 
    } 
    } 
    if (crc32Client != crc32Server) { 
    //  deleteFile(fileName); 
    throw new IOException("CRC32 did not match for file '" + fileName + "': " + crc32Client + "!=" 
     + crc32Server); 
    } 
} 
+0

Vous obtiendriez probablement plus de réponses si vous n'en faites pas un wiki communautaire. –

Répondre

6

Vous devez utiliser un BufferedOutputStream au lieu d'un FileWriter/BufferedWriter. En général, *Streams gère les données binaires brutes, tandis que *Writers gère les données de caractères (ce qui est une interprétation des données binaires brutes pour un codage de caractères donné).

+0

Maintenant, j'ai au moins la même taille de fichier, merci pour le tipp. Mais le contrôle CRC échoue toujours ... – roesslerj

+0

Le téléchargement de Firefox donne-t-il le même CRC32? –

+0

Semble être un problème de différents calculs CRC32, le fichier téléchargé est maintenant binaire identique à celui sur le serveur ... Merci pour l'aide jusqu'à présent. Je suppose que maintenant je suis à nouveau sur la route ;-) – roesslerj

Questions connexes