Загрузка в Амазоне
У веб-панели S3 есть особенность: если скачать оттуда файл, Амазон поправит
расширение в зависимости от Content-Type, который назначили файлу при
создании. Например, если у файла нет расширения, а Content-Type равен
application/json
, то Амазон допишет в конец .json, чтобы файлик открылся.
Казалось бы, хорошо? А вот что имеем на практике.
Если залить файл hello.json.gzip
, внутри которого сжатый Gzip-ом JSON, и
указать заголовки Content-Type: application/json
, Content-Encoding: gzip
, то
при загрузке произойдет следующее.
Файл будет декодирован Амазоном, чтобы клиенту не пришлось делать это руками. Не бог весть какая помощь, потому что и текстовые редакторы, и файловые менеджеры открывают gzip-файлы. Но ладно.
После раскодировки Амазон смотрит: что там внутри? Application/json? Значит
удалим .gzip
и добавим .json
. В результате получается файл
hello.json.json
. Я не шучу, проверьте сами.
Второй случай: я залил в Амазон файл report.xlsx
, но указал не тот
Content-Type. Указал старый application/vnd.ms-excel
для xls документов, а
надо было такую колбасу:
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
. При
загрузке Амазон молча исправил расширение с .xlsx
на .xls
. А Эксель тоже
хорош: по клику на файл он пишет, что формат битый, ничего не знаю – нет бы
первые 100 байтов проверить, тупица.
На ровном месте Амазон заруинил файл, хотя никто об этом не просил.
Понимаете, не нужно мне помогать! Не нужно что-то тайно переименовывать для моей же пользы. Если прям чешется в одном месте – спроси, и я нажму “больше не спрашивать”.
Кроме того, надо помнить: в Амазоне работают не боги, а такие же кодеры, как и везде. Перед нами обычный баг, который живет в проде не один год, и никому нет дела. Баг состоит в том, что махинации с расширением нужно производить только если у файла нет расширения. Вдобавок у расширения приоритет выше, чем у Content-Type, потому что последний – это метаинформация, которая может потеряться или исказиться. Вероятность потерять расширение гораздо ниже, нежели Content-Type.
Верю, что когда-нибудь в Амазоне это поймут.
Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter