Просмотр изображений в полном размере

Проблема в том, что CDN получает некорректное поведение, чего вы явно не хотите. Работает корректно только не-CDN: при нажатии на «скачать» что-то действительно скачивается.

Ага, да, тогда нужно исправить.

Справедливо. Есть ли какие-либо примеры настройки лайтбокса, которые я мог бы использовать в качестве отправной точки?

Это совсем не подвержено взлому, что подтверждается:

Вам нужно изучить документацию по Magnific Popup: Responsive jQuery Lightbox Plugin и проверить, можно ли как-то перенастроить её на лету.

Обидно, я попробую что-нибудь придумать.

Просто из любопытства — почему Discourse выбирает действие «скачать» вместо «просмотреть в полном размере» здесь? С точки зрения пользователя, кажется, что просмотр в полном размере — более частое действие?

Я думал, что это проблема с MIME, но, судя по заголовку, дело может быть в:

x-download-options: noopen

Это предотвращает открытие файла при загрузке. Надеюсь, Сэм сможет прояснить ситуацию.

:man_shrugging:t4: Это решение @codinghorror, я полагаю, что так можно чисто сохранить оригинальное имя загруженного файла, что важно некоторым пользователям. Кроме того, похоже, что Flickr тоже так делает.

Я не думаю, что мы будем что-то менять в этом, мы просто настроим приложение для проксирования через специальный маршрут или что-то в этом роде. Количество пользователей, нажимающих «скачать», ничтожно мало, поэтому обход CDN может быть приемлем здесь. В любом случае @pmusaraj сможет определить наилучшее решение. Насколько я понимаю, нам либо нужно попросить AWS предоставить подписанный URL со специальным заголовком Content-Disposition, либо проксировать файл. В обоих случаях потребуется обход CDN S3. Если мы будем проксировать через приложение, то хотя бы сможем использовать CDN приложения.

После небольшого дополнительного чтения выяснилось, что за такое поведение отвечают content-disposition: attachment; и x-download-options: noopen.

Понимаю, что это объяснение того, как это работает, а не почему. Однако, если это сделано в целях безопасности, всё абсолютно логично.

Этот PR должен исправить это следующим образом:

  1. добавление атрибута data-download-href к ссылке на загрузку в лайтбоксе, когда включена загрузка в S3;
  2. используемый URL — новая схема коротких URL с параметром dl=1, благодаря которому контроллер генерирует подписанный URL S3 с правильным заголовком content-disposition и именем файла.

Другими словами, ссылка на загрузку в лайтбоксе теперь будет выглядеть как /uploads/short-url/mTGbg4Ld2iBYAbfTvEjGXP2LtVm.pdf?dl=1, которая будет перенаправлять на подписанный URL S3 с заголовком content-disposition: "attachment; filename=original.png".

Я считаю, что это самый простой и прямой вариант. Проксирование через приложение было бы немного менее эффективным, так как загружаемый файл должен был бы проходить путь от S3 к серверу Discourse, а затем к клиенту.