O problema é que o CDN está apresentando um comportamento quebrado, que é exatamente o que você não quer. Apenas o não-CDN funciona corretamente, pois ao clicar em “download”, algo é efetivamente baixado.
Ah, sim, então devemos corrigir.
Justo. Existem exemplos de personalização da lightbox que eu possa usar como ponto de partida?
Isso não é facilmente hackeável, conforme:
Você precisaria ler Magnific Popup: Responsive jQuery Lightbox Plugin e verificar se é possível reconfigurá-lo dinamicamente de alguma forma.
Que pena, vou ver se consigo resolver algo.
Apenas por curiosidade: por que o Discourse opta por uma ação de ‘download’ em vez de ‘ver tamanho original’ aqui? Do ponto de vista do usuário, parece que ver o tamanho original seria uma ação mais comum?
Eu achei que fosse um problema de MIME, mas olhando o cabeçalho, pode ser:
x-download-options: noopen
O que impede que um arquivo seja aberto ao ser baixado. Esperando que Sam possa esclarecer.
É uma decisão do @codinghorror. Suponho que seja uma maneira de manter limpo o nome original do arquivo carregado, algo que algumas pessoas valorizam. Além disso, parece ser o que o Flickr costuma fazer.
Acho que não vamos mexer em nada disso. Vamos fazer com que o app faça o proxy disso em uma rota dedicada ou algo assim. O número de pessoas clicando em “download” é insignificante, então um desvio do CDN pode ser aceitável aqui. De qualquer forma, o @pmusaraj pode decidir qual é a melhor solução. Pelo que entendi, ou precisamos instruir a AWS a fornecer uma URL assinada com um disposition de conteúdo especial, ou precisamos fazer o proxy do arquivo. Em ambos os casos, haverá um desvio do CDN da S3. Se fizermos o proxy pelo app, pelo menos poderemos usar o CDN do próprio app.
Após uma leitura um pouco mais aprofundada, parece que content-disposition: attachment; e x-download-options: noopen são responsáveis por esse comportamento.
Agradeço que essa seja a forma como acontece, e não o porquê. Se for por motivos de segurança, faz todo o sentido.
Esse PR deve corrigir o problema da seguinte forma:
- Adicionar um
data-download-hrefao link de download da lightbox quando os uploads S3 estiverem habilitados - A URL utilizada é o novo esquema de URL curta com um parâmetro
dl=1, que fará com que o controlador gere uma URL assinada do S3 com ocontent dispositione o nome do arquivo corretos
Em outras palavras, o link de download na lightbox agora se parecerá com /uploads/short-url/mTGbg4Ld2iBYAbfTvEjGXP2LtVm.pdf?dl=1, que redirecionará para uma URL assinada do S3 com content-disposition: "attachment; filename=original.png".
Acho que essa é a opção mais simples e direta; fazer o proxy através do aplicativo seria um pouco menos eficiente, pois o arquivo baixado teria que ir do S3 para o servidor do Discourse e, em seguida, para o cliente.