Проверка Android успешно загружена

1

Для загрузки материала я работаю с классами apache HTTPResponse HTTPClient и т.д. Я проверяю правильную загрузку следующим образом:

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, посмотрите на это: stackoverflow.com/q/5897191/346309 stackoverflow.com/q/3418106/346309 stackoverflow.com/q/ 3617507/346309 . Я просто держусь подальше от вашего метода и использую более надежную контрольную сумму MD5.
Теги:
http-headers
httpresponse

1 ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню