Загрузка выглядит повреждённой: сравните хеши на обоих концах
Неудачная загрузка не доказывает, что туннель изменил байты. Сравните предполагаемый файл с сохранённым результатом, затем найдите первую границу, где они расходятся.
Получатели, которые не могут открыть загруженный файл, часто слышат, что VPN его повредил. Это гипотеза, а не наблюдение, и её можно проверить. Прежде чем трогать туннель, установите, отличается ли объект, сейчас сохранённый в пункте назначения, от объекта, который должен был быть отправлен. Всё остальное следует из этого ответа.
Начните с предполагаемых байтов, а не с жалобы
Выберите безвредный файл, который воспроизводит проблему, или реальный файл, если политика разрешает ему покинуть исходную среду. Перед передачей запишите две вещи: точный размер в байтах и современный хеш содержимого. Имена файлов, метки времени и предпросмотры — это метаданные, и ни одно из них не идентифицирует содержимое.
Вычислите хеш алгоритмом, который могут запустить оба конца, и запишите, какой вы использовали. Сравнение между SHA-256 и MD5 не является сравнением, и сравнение двух разных файлов, случайно имеющих одно имя, тоже.
PS> Get-FileHash -LiteralPath "C:\uploads\report.csv" -Algorithm SHA256
Hash Path
---- ----
9F2C... C:\uploads\report.csv
Справочник Microsoft по Get-FileHash описывает команду и её параметр алгоритма, именно ту часть, которую люди пропускают, когда сравнение даёт бессмысленное расхождение.
Один хеш на этап, тот же алгоритм
Теперь вычислите тот же алгоритм на сохранённом объекте там, где он в конечном счёте находится, разрешённым методом, а не на копии, прошедшей через другой инструмент. Сохранение полученного файла локально и хеширование этой копии добавляет шаг, который вы не проверяли.
Если сервис публикует собственное значение целостности, относитесь к нему как к отдельному наблюдению. Контрольная сумма, о которой сообщает поставщик, может сказать, что поставщик считает сохранённым, и это не то же утверждение, что отправил ваш клиент.
Возможны три исхода, и они указывают в разные стороны. Равные хеши означают, что байты прибыли неизменными. Разные хеши с известным преобразованием означают, что сервис намеренно создал новый объект. Разные хеши без преобразования означают, что что-то между двумя точками изменило содержимое, и следующий шаг — найти самую раннюю границу, где это произошло.
Отделите сбой передачи от преобразования
Частичная загрузка и повреждённая загрузка выглядят в файловом браузере одинаково и являются разными неисправностями. Проверьте, завершилась ли передача: журнал приложения с прерванным запросом, сохранённый файл, размер которого является префиксом источника, или объект, который на самом деле является страницей ошибки, сохранённой под ожидаемым расширением, всё это указывает на неполную передачу, а не на изменённые байты.
Преобразование — другое частое объяснение. Сервис, который пересжимает изображения, переписывает концы строк CSV или конвертирует документ, законно создаст хеш, отличающийся от исходного, и это не повреждение. Сравнивайте этап, который заявляет, что является точной копией, а не окончательный формат представления.
Задержка и потери относятся к третьей категории. Они могут заставить клиент выйти по тайм-ауту, повторить попытку или сдаться, и ничто из этого не означает, что байты, принятые сервером, были тихо изменены. Посмотрите на результат передачи, прежде чем что-либо приписывать туннелю.
Попробуйте второй путь, не меняя всё
Если хеши действительно различаются и преобразования нет, повторите тот же файл, клиент, протокол и назначение по другому поддерживаемому пути, например через локальную сеть вместо VPN. Измените одну переменную. Одновременное изменение клиента, конечной точки и инструмента даёт результат, который вы не можете ничему приписать.
Держите сравнение честным в обоих направлениях. Хеш говорит, что две точки расходятся или совпадают по содержимому; он не говорит, какая сторона заслуживает доверия, поэтому держите ожидаемое значение и проверку внутри модели доверия, на которую вы действительно опираетесь.
Завершите конкретным предложением в заявке: передача остановилась рано, приложение преобразовало объект, хранилище его изменило, или байты совпадают и чтение их — это сбой. У каждого из них разный владелец, и ни один из них по умолчанию не является VPN.