У меня есть некоторый код устаревшего кода в одном из приложений, который используется для загрузки файлов PDF (размер файла PDF составляет около 350-400 КБ), и в последнее время мы жаловались (около 1% клиентов) на то, что загрузка PDF не работает с поврежденными/поврежденными файловыми ошибками.
Ниже приведен фрагмент кода (C++ приложение) для загрузки
String header;
header.append("Content-type: application/force-download\r\n");
header.append("Content-Transfer-Encoding: Binary\r\n");
header.append("Content-length: %d\r\n", filebuf.length());
header.append("Connection: Close\r\n");
header.append("Content-disposition: attachment; filename=%s\r\n\r\n", filename_to_download.chars());
Класс String и метод append - это просто пример.
Я понимаю, что выше заголовки не лучший способ запуска загрузки файла PDF (я упростил заголовки, имея "Content-Type application/octet-stream и Content-Disposition: attachment; filename = example.pdf" и похоже, что он работает для меня).
Но я не могу понять, почему выше оригинальный код не должен работать 1% времени.
Я пытался понять комбинацию браузера /adobe, но, похоже, здесь нет шаблона. ДА Одна из немногих упомянутых клиентов - это когда они перешли на "хромированный браузер", который работал большую часть времени.
Любые указатели?
После нескольких дней борьбы, наконец, выяснилось, что происходит здесь.
Мы устанавливаем длину содержимого как размер буфера (размер файла pdf) в заголовке из нашего кода и отправляем эти данные клиенту, но промежуточный модуль apache mod_gzip/mod_deflate сжимает буфер данных, а доступ к клиенту/браузеру - "Content-Length: 100 байт ", но фактические данные говорят 60-70 байт.
Не каждый браузер жалуется на это несоответствие, но некоторые браузеры рассматривают это как ошибку FATAL и показывают сообщение "невозможно загрузить файл" (мы часто видели эту проблему в Win8/IE10 и Win8/IE11, могут быть и другие параметры безопасности вызывая это в браузере!).
Для исправления мы удалили "Content-Length" из заголовка.