2012-06-22 1 views
0

Для загрузки материала я работаю с классами апача HTTPResponse HTTPClient и т.д. я проверить на правильность загрузки, как это:проверка загрузки Android успешно

entity.writeTo(new FileOutputStream(outfile)); 
     if(outfile.length()!=entity.getContentLength()){ 
      long fileLength = outfile.length(); 
      outfile.delete(); 
      throw new Exception("Incomplete download, "+fileLength+"/" 
        +entity.getContentLength()+" bytes downloaded"); 

     } 

Но, кажется, что исключение никогда не срабатывает. Как правильно справиться с этим? Является ли entity.getContentLength длиной файла на сервере или количеством полученных данных?

+0

Я хотел бы предостеречь против использования entity.getContentLength, как это кажется, есть проблема с ним всегда возвращается -1, Посмотрите на это: HTTP: // stackoverflow.com/q/5897191/346309 http://stackoverflow.com/q/3418106/346309 http://stackoverflow.com/q/3617507/346309. Я просто избегаю вашего метода и использую более надежную контрольную сумму MD5. – JPM

ответ

2

В запросе файла всегда должна быть указана контрольная сумма MD5. Если у вас есть MD5-заголовок, все, что вам нужно сделать, это проверить это на файлы, созданные MD5. Затем, сделав это, лучше сделать это так, как вы можете иметь файл с таким же количеством байтов, но один байт становится искаженным при передаче.

 entity.writeTo(new FileOutputStream(outfile)); 
     String md5 = response.getHeaders("Content-MD5")[0].getValue(); 
     byte[] b64 = Base64.decode(md5, Base64.DEFAULT); 
     String sB64 = IntegrityUtils.toASCII(b64, 0, b64.length); 
     if (outfile.exists()) { 
      String orgMd5 = null; 
      try { 
       orgMd5 = IntegrityUtils.getMD5Checksum(outfile); 
      } catch (Exception e) { 
        Log.d(TAG,"Exception in file hex..."); 
      } 
      if (orgMd5 != null && orgMd5.equals(sB64)) { 
       Log.d(TAG,"MD5 is equal to files MD5"); 
      } else { 
       Log.d(TAG,"MD5 does not equal files MD5"); 
      } 
     } 

Добавить этот класс в проект:

public class IntegrityUtils { 
public static String toASCII(byte b[], int start, int length) { 
    StringBuffer asciiString = new StringBuffer(); 

    for (int i = start; i < (length + start); i++) { 
     // exclude nulls from the ASCII representation 
     if (b[i] != (byte) 0x00) { 
      asciiString.append((char) b[i]); 
     } 
    } 

    return asciiString.toString(); 
} 

public static String getMD5Checksum(File file) throws Exception { 
    byte[] b = createChecksum(file); 
    String result = ""; 

    for (int i = 0; i < b.length; i++) { 
     result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1); 
    } 
    return result; 
} 

public static byte[] createChecksum(File file) throws Exception { 
    InputStream fis = new FileInputStream(file); 

    byte[] buffer = new byte[1024]; 
    MessageDigest complete = MessageDigest.getInstance("MD5"); 
    int numRead; 

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

    fis.close(); 
    return complete.digest(); 
} 
} 
+0

Хорошо сделано по редактированию – JPM

+0

К сожалению, несколько серверов отправляют заголовок md5, насколько мне известно. Я попросил своего веб-мастера добавить его в конфигурацию. Еще несколько тестов указывают, что в моем случае entity.getContentLength возвращает то же самое, что и response.getHeaders («Content-Length»). Я собираюсь принять этот ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^