Файлы мультимедиа (кроме изображений), хранящиеся в локальном хранилище или перенесенные в S3 с помощью rake uploads:migrate_to_s3, скачиваются с оригинальными именами файлов при клике на ссылку загрузки, тогда как файлы мультимедиа (кроме изображений), загруженные напрямую в S3, открываются в новой вкладке, и оригинальное имя файла теряется.
Команда rake uploads:migrate_to_s3 устанавливает content_disposition для всех неизображений.
в то время как загрузка в S3 устанавливает content_disposition только для всех не мультимедийных файлов.
Исправление заключается в замене is_supported_media на is_supported_image (проверено и работает как ожидается).
Посмотрев на это ещё раз, я думаю, что решение должно быть наоборот — задача uploads:migrate_to_s3 должна выполняться с условием if !FileHelper.is_supported_media?(name). Не имеет смысла добавлять заголовок content-disposition: attachment; filename=X для видео и аудио. Разве вы не воспроизводите эти файлы внутри поста Discourse, а не скачиваете их?
Таким образом, нам нужно следующее:
Без заголовка content-disposition attachment
Изображения
Видео
Аудио
С заголовком content-disposition attachment и оригинальным именем файла
Все остальные вложения/загрузки (PDF, TXT, CSV и т. д.)
Если я что-то упускаю, пожалуйста, не стесняйтесь добавить больше информации или примеров.
Поверьте, я потратил дни на то, чтобы разобраться в этом, и мне это тоже показалось странным, но установка 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 всё ещё работает, но ссылки для скачивания с оригинальными именами файлов больше недоступны).
Если вам нужна дополнительная информация, пожалуйста, дайте знать.
Честно говоря, я не углублялся в это дальше из-за других срочных задач. Сейчас я выделил время в своём графике, чтобы на этой неделе детально разобраться в вопросе. Изменения кажутся незначительными, поэтому это не займёт много времени. Как только PR будет готов, я отчитаюсь.
@md-misko Я подтвердил ваш сценарий использования, и после исправления заголовка content-disposition я по-прежнему могу корректно стримить аудио и видео. Исправление сейчас собирается и должно быть слито до конца дня: