No se pueden descargar archivos multimedia que no son imágenes; los nombres de archivo originales se pierden al subirlos a S3

Los archivos multimedia distintos de imágenes que residen en almacenamiento local o que se migraron a S3 usando rake uploads:migrate_to_s3 se descargan con sus nombres de archivo originales al hacer clic en el enlace de carga, mientras que los archivos multimedia distintos de imágenes cargados directamente a S3 se abren en una nueva pestaña y se pierde el nombre de archivo original.

rake uploads:migrate_to_s3 establece content_disposition para todas las cargas distintas de imágenes

mientras que la carga a S3 establece content_disposition solo para todas las cargas distintas de multimedia

La solución consiste en reemplazar is_supported_media por is_supported_image (probado y funcionando como se esperaba).

3 Me gusta

¿Necesitamos esta corrección, @sam?

3 Me gusta

posiblemente @martin, ¿qué opinas de que ese cambio sea correcto?

4 Me gusta

Creo que esta corrección suena bien. Déjame probar tus cambios propuestos localmente y, si todo parece correcto, haré un PR.

3 Me gusta

Al verlo de nuevo, creo que la solución es al revés: la tarea uploads:migrate_to_s3 debería tener la condición if !FileHelper.is_supported_media?(name). No tiene sentido añadir el encabezado content-disposition: attachment; filename=X a los videos y al audio. ¿No estás transmitiendo esos archivos desde dentro de una publicación de Discourse en lugar de descargarlos?

Por lo tanto, lo que deberíamos tener es:

Sin encabezado content-disposition attachment

  • Imágenes
  • Videos
  • Audio

Sí, encabezado content-disposition attachment con el nombre de archivo original

  • Todos los demás adjuntos/subidas (PDF, TXT, CSV, etc.)

Si no estoy viendo algo, siéntete libre de añadir más información o ejemplos.

3 Me gusta

Créeme, he pasado días investigando esto y también me pareció extraño, pero establecer content-disposition: attachment; filename=X para todos los archivos multimedia excepto las imágenes imita perfectamente cómo se sirven actualmente los archivos multimedia desde el almacenamiento local.

En resumen, ¡NO! Puedo reproducirlos usando oneboxing si es necesario, pero el enlace de descarga directa [media_file](path_to_media_file) (donde la ruta es local o de S3) debería descargar el archivo usando su nombre original, tal como lo hace en el almacenamiento local (y para los archivos migrados a S3).

Pero esto de repente ya no es posible para las subidas directas a S3: el enlace [media_file](S3_path_to_media_file) reproduce el archivo multimedia en una nueva pestaña (lo cual no es necesario, ya que eso es lo que hace oneboxing), y al intentar descargarlo desde los controles del reproductor también pierde su nombre original.

Esperaría que los archivos alojados localmente y en S3 se comporten igual, ¿de acuerdo? Con tu propuesta, la funcionalidad se invertiría por completo para las subidas alojadas en S3, no solo para las nuevas, sino también para las migradas.

Aquí hay un caso detallado y por qué creo que mi propuesta es correcta (es decir, mantiene la misma funcionalidad para las subidas alojadas tanto localmente como en S3):

Archivos alojados localmente

Tengo un repositorio grande (más de 5000) de archivos de audio (voz) que van de 1 a 10 MB, con un total de ~40 GB, que actualmente están alojados en almacenamiento local y ahora se están transfiriendo a S3 (esto es por diseño, no quiero que estén alojados en un servicio de terceros). Esto ya funciona bastante bien desde el punto de vista del rendimiento, pero ahora tiene sentido migrar a S3 debido al aumento de los costos de almacenamiento y la opción de usar una CDN con S3.

Estos archivos están optimizados para el tamaño y no están destinados a ser transmitidos, sino descargados y escuchados localmente (para clientes con ancho de banda/conectividad limitado). Los archivos se suben por lotes y luego se hacen referencia en la publicación cruda usando enlaces generados a partir de sus respectivos valores SHA1 usando: [dl_link](https://discourse.forum.tld/uploads/default/original/3X/0/1/0123..sha1.mp3) y se pueden descargar usando su nombre original haciendo clic en el enlace directo al archivo (ver ejemplo aquí).

Si, por otro lado, estos enlaces fueran oneboxed, aún podrían reproducirse directamente desde el servidor de Discourse (y también descargarse desde los controles del reproductor, nuevamente con el nombre original).

Archivos que fueron migrados a S3

Cuando las subidas se migran desde el almacenamiento local a S3 usando uploads:migrate_to_s3, ocurren dos cosas:

  • Se establece content-disposition: attachment; filename=X para todas las subidas excepto las imágenes
  • Los enlaces locales directos [dl_link](https://discourse.forum.tld/uploads/default/original/3X/0/1/0123..sha1.mp3) en publicaciones crudas se reemplazan con enlaces de S3 [dl_link](https://cdn_url/uploads/original/3X/0/1/0123..sha1.mp3)

Esto imita las subidas alojadas localmente en todos los aspectos (enlaces de descarga con nombres originales, así como oneboxing).

Archivos recién subidos a S3

  • content-disposition: attachment; filename=X no se establece para todos los archivos multimedia
  • Los archivos recién subidos se hacen referencia usando una URL corta en crudo, pero los enlaces cocinados aún apuntan directamente a https://cdn_url/uploads/original/3X/0/1/0123..sha1.mp3
  • hacer clic en el enlace de URL corta o en el enlace de S3 insertado manualmente [dl_link](https://cdn_url/uploads/original/3X/0/1/0123..sha1.mp3) abre el archivo en una nueva pestaña en lugar de descargarlo.

Como content-disposition no está establecido, esto ahora difiere de cómo se sirven los archivos multimedia desde el almacenamiento local (oneboxing aún funciona, pero los enlaces de descarga con nombres originales ya no están disponibles).

Si necesitas información adicional, házmelo saber.

2 Me gusta

¡Eso es genial, gracias por proporcionar todo ese contexto adicional! Voy a probarlo y procuraré abrir una PR la próxima semana.

5 Me gusta

¿Hay alguna posibilidad de que esto se incluya en la versión final 2.5, que está próxima a salir?

1 me gusta

Para ser honesto, no he profundizado más en esto debido a otras tareas urgentes. Ahora he reservado tiempo en mi agenda para revisarlo adecuadamente esta semana. El cambio parece menor, así que no debería llevar mucho tiempo. Informaré en cuanto se complete la PR.

4 Me gusta

@md-misko Confirmé tu caso de uso y, tras corregir el content-disposition, aún puedo transmitir audio y video correctamente. La corrección se está compilando ahora y debería fusionarse antes del final del día:

¡Gracias por tu paciencia!

4 Me gusta

Este tema se cerró automáticamente después de 3 días. Ya no se permiten nuevas respuestas.