Как проверить целостность файла

Я разрабатываю приложение, которое необходимо каждые несколько минут загружать некоторые файлы.

Используя php, я перечисляю все файлы, а из java я получаю этот список и проверяю наличие файла, если он присутствует или нет. После загрузки мне нужно проверить целостность, потому что иногда после загрузки некоторые файлы повреждаются.

try{
    String path = ...
    URL url = new URL(path);
    URLConnection conn = url.openConnection();
    conn.setDoOutput(true);         
    conn.setReadTimeout(30000);
    is = conn.getInputStream();
    ReadableByteChannel rbc = Channels.newChannel(is);
    FileOutputStream fos = null;
    fos = new FileOutputStream(local);
    fos.getChannel().transferFrom(rbc, 0, 1 << 24);
    fos.close();
    rbc.close();
} catch (FileNotFoundException e) {
    if(new File(local).exists()) new File(local).delete();
       return false;
} catch (IOException e) {
    if(new File(local).exists()) new File(local).delete();
       return false;
} catch (IOException e) {
    if(new File(local).exists()) new File(local).delete();
       return false;
}

return false;

Что я могу использовать в php и java для проверки целостности файла?


person JackTurky    schedule 20.04.2013    source источник


Ответы (1)


Создайте список контрольных сумм на своем сервере, загрузите файл, сгенерируйте контрольную сумму загруженного файла и проверьте, совпадает ли она с той, что находится на сервере. Если это так, ваш файл в порядке.

person Raghav Sood    schedule 20.04.2013
comment
хорошо для php, но для java я не могу понять, как я могу использовать is = new DigestInputStream(is, md); - person JackTurky; 20.04.2013
comment
иначе, если я проверю длину файла? это более быстрый метод? - person JackTurky; 20.04.2013
comment
@JackTurky Файл может быть поврежден и иметь ту же длину. Или это может быть совершенно нормально и иметь разную длину на устройстве и сервере из-за различий в файловой системе и ОС. Контрольная сумма является наиболее точной. Приведенный пример кода довольно прост. Сделайте файловый входной поток вашего файла, получите из него дайджест-входной поток, прочитайте файл, а затем преобразуйте его в контрольную сумму MD5. - person Raghav Sood; 20.04.2013
comment
хорошо, String md5 = DigestUtils.md5Hex (новый FileInputStream (файл)); и $md5 = md5_file($file); Правильно? - person JackTurky; 20.04.2013
comment
@JackTurky Требуется чтение всего файла, поэтому он будет медленным. Вы можете переместить его в фоновый поток или асинхронную задачу. - person Raghav Sood; 20.04.2013