Не удается загрузить файлы медиа, отличные от изображений; оригинальные имена файлов теряются при загрузке в S3

Поверьте, я потратил дни на то, чтобы разобраться в этом, и мне это тоже показалось странным, но установка content-disposition: attachment; filename=X для всех медиафайлов, кроме изображений, идеально имитирует то, как медиафайлы в настоящее время раздают с локального хранилища.

Кратко: НЕТ! При необходимости я могу транслировать их с помощью oneboxing, но прямая ссылка для скачивания [media_file](path_to_media_file) — где путь может быть как локальным, так и S3 — должна скачивать файл с его оригинальным именем, точно так же, как это происходит на локальном хранилище (и для файлов, перенесённых на S3).

Однако теперь это внезапно стало невозможно для прямых загрузок на S3: ссылка [media_file](S3_path_to_media_file) открывает медиафайл в новой вкладке (что не нужно, так как это делает oneboxing), а при попытке скачать его через элементы управления медиаплеером оригинальное имя файла также теряется.

Я ожидаю, что файлы, размещённые локально и на S3, должны вести себя одинаково, согласны? С вашим предложением функциональность для загрузок на S3 будет полностью инвертирована, причём это затронет не только новые файлы, но и перенесённые.

Вот подробное описание случая и причины, по которым я считаю, что моё предложение верно (то есть оно сохраняет одинаковую функциональность для загрузок, размещённых как локально, так и на S3):

Файлы, размещённые локально

У меня есть большое (более 5000 файлов) хранилище аудиофайлов (речь) размером от 1 до 10 МБ, общий объём которых составляет около 40 ГБ. В настоящее время они размещены на локальном хранилище, но теперь переносятся на S3 (это сделано намеренно, я не хочу, чтобы они размещались на стороннем сервисе). С точки зрения производительности это уже работает довольно хорошо, но сейчас имеет смысл перенести их на S3 из-за растущих затрат на хранение и возможности использования CDN с S3.

Эти файлы оптимизированы по размеру и не предназначены для потоковой передачи; их следует скачивать и прослушивать локально (для клиентов с ограниченной пропускной способностью/соединением). Файлы загружаются пакетно, а затем ссылаются в необработанном тексте поста с помощью ссылок, сгенерированных из их соответствующих значений SHA1, используя формат: [dl_link](https://discourse.forum.tld/uploads/default/original/3X/0/1/0123..sha1.mp3). Их можно скачать с оригинальным именем файла, нажав на прямую ссылку на файл (см. пример здесь).

С другой стороны, если бы эти ссылки были oneboxed, их всё равно можно было бы транслировать напрямую с сервера Discourse (а также скачивать через элементы управления плеером, опять же с оригинальным именем файла).

Файлы, перенесённые на S3

При переносе загрузок с локального хранилища на S3 с помощью задачи uploads:migrate_to_s3 происходит следующее:

  • Для всех загрузок, кроме изображений, устанавливается content-disposition: attachment; filename=X.
  • Прямые локальные ссылки [dl_link](https://discourse.forum.tld/uploads/default/original/3X/0/1/0123..sha1.mp3) в необработанном тексте заменяются на ссылки S3 [dl_link](https://cdn_url/uploads/original/3X/0/1/0123..sha1.mp3).

Это в точности имитирует загрузку, размещённую локально (ссылки для скачивания с оригинальными именами файлов, а также работающий oneboxing).

Файлы, только что загруженные на S3

  • Для всех медиафайлов не устанавливается content-disposition: attachment; filename=X.
  • Недавно загруженные файлы ссылаются в необработанном тексте через короткую ссылку, но обработанные ссылки всё ещё указывают напрямую на https://cdn_url/uploads/original/3X/0/1/0123..sha1.mp3.
  • При нажатии на ссылку с коротким URL или вручную вставленную ссылку S3 [dl_link](https://cdn_url/uploads/original/3X/0/1/0123..sha1.mp3) файл открывается в новой вкладке вместо скачивания.

Поскольку content-disposition не установлен, это теперь отличается от того, как медиафайлы раздают с локального хранилища (oneboxing всё ещё работает, но ссылки для скачивания с оригинальными именами файлов больше недоступны).

Если вам нужна дополнительная информация, пожалуйста, дайте знать.

2 лайка