Ссылка или кнопка
Сверяем href, атрибут download, обработчик клика, параметры документа и отсутствие перекрывающего слоя.
Файл и ответ сервера
Проверяем ссылку, доступ к файлу, ответ сервера и обработку загрузки в браузере. Возвращаем посетителю рабочее скачивание документа, архива или сформированного отчёта.
Диагностика
Мы проверяем действие последовательно. Кнопка должна создать правильный запрос, сервер должен вернуть доступный файл, а браузер должен получить понятные заголовки и завершить загрузку.
Сверяем href, атрибут download, обработчик клика, параметры документа и отсутствие перекрывающего слоя.
Проверяем ответы 200, 403 и 404, авторизацию, срок временной ссылки и права пользователя на конкретный файл.
Смотрим Content-Type, Content-Length и Content-Disposition, включая кодировку имени и режим attachment.
Проверяем, успевает ли приложение создать PDF, таблицу или архив и не попадает ли текст ошибки внутрь файла.
Сверяем подпись URL, перенаправления, CORS, доступность исходного объекта и передачу диапазонов для крупных файлов.
Тестируем мобильную загрузку, блокировку всплывающих окон, Blob-адреса, внешние приложения и повторный клик.
Результат
Открытый файл доступен по ссылке, а закрытый выдаётся только пользователю с нужными правами.
Браузер получает правильный тип, расширение и имя без нечитаемых символов.
Сайт не сохраняет HTML-страницу ошибки под видом PDF или архива и показывает следующий шаг.
Порядок работ
Для первого разбора нужен URL страницы, название кнопки и ожидаемый тип файла. Если документ доступен после входа, согласуем тестового пользователя с минимальными правами.
Фиксируем браузер, статус ответа, цепочку переходов, заголовки и размер полученных данных.
Отделяем ошибку ссылки от доступа, формирования документа и внешнего хранилища.
Меняем маршрут, заголовок, генератор или правила доступа с учётом защиты закрытых документов.
Проверяем мобильный браузер, авторизацию, повторную загрузку, имя файла и недопустимый доступ.
Документация MDN по Content-Disposition объясняет разницу между показом файла в браузере и выдачей как вложения. Конкретное поведение также зависит от типа ресурса и браузера.
Границы работ
Для файлов личного кабинета сохраняем проверку пользователя и объекта. Прямая постоянная ссылка может решить видимую ошибку, но открыть документ посторонним. Если файл создаёт бухгалтерская система, CRM или сторонний генератор, для диагностики понадобятся тестовые данные и журнал этого сервиса. Повреждённый исходник нужно заменить или сформировать заново: заголовки ответа не восстановят отсутствующее содержимое.
Вопросы
Проверяем тип ресурса, атрибут download и Content-Disposition. Браузер учитывает все три сигнала.
В файл могла попасть ошибка приложения, генерация могла оборваться, либо сервер отдал неполный ответ.
Тестируем Blob-адрес, всплывающее окно, внешний просмотрщик, разрешения и запуск загрузки после асинхронного действия.
При загрузке пользователь отправляет файл сайту. При скачивании сервер выдаёт файл пользователю, поэтому цепочка и ограничения другие.
Первый шаг
Пришлите адрес страницы, устройство и описание результата. Закрытый документ с личными данными передавать не нужно.