Es posible que hayas notado en los últimos meses muchos commits relacionados con las cargas en Discourse core. Esto ha sido parte de un esfuerzo general dentro de core para reemplazar los usos de jQuery file upload de nuestra base de código, como parte de un esfuerzo general aún más amplio para reemplazar los usos de jQuery en sí de nuestra base de código. jQuery file uploader es un proyecto muy antiguo y ha sido parte de Discourse core desde casi el principio. Creo que también lo he usado durante toda mi carrera en otros proyectos. Pero es hora de jubilar al viejo y confiable:
Hemos reemplazado jQuery file upload (y pronto también reemplazaremos otra biblioteca, resumable.js) con una biblioteca llamada Uppy. Esta es una biblioteca de carga mucho más moderna, que se puede extender fácilmente con plugins y es capaz de manejar todos los diferentes flujos de trabajo que le presentamos. Es importante destacar que esto nos permite realizar cargas multipart directas a S3 desde el cliente de Discourse, en lugar de tener que enviar archivos grandes a través de nuestra API.
El compositor ahora usa Uppy para todas las cargas, y muchos otros lugares de la aplicación lo usan (cargas de avatares, cargas de fondos de perfil, etc.). Los últimos elementos pendientes desaparecerán en las próximas semanas. Este debería ser un cambio en gran medida invisible para la mayoría de los usuarios, pero los autores de plugins y componentes de temas deberán realizar algunos cambios.
API de Plugins
Preprocesadores
Todos los preprocesadores de carga ahora deben escribirse como un plugin de Uppy. Estos plugins son bastante sencillos de escribir y utilizan un flujo de trabajo simple basado en promesas. Un preprocesador de carga puede modificar un archivo o agregarle metadatos antes de que Uppy lo cargue en S3 o en el endpoint /uploads.json. Ya tenemos varios preprocesadores en core que puedes usar como referencia al escribir los tuyos:
- discourse/app/assets/javascripts/discourse/app/lib/uppy-checksum-plugin.js at 6662101208089def86ed18a81ac90d1c52670569 · discourse/discourse · GitHub
- discourse/app/assets/javascripts/discourse/app/lib/uppy-media-optimization-plugin.js at 6662101208089def86ed18a81ac90d1c52670569 · discourse/discourse · GitHub
Los preprocesadores de carga para el compositor se registran a través de api.addComposerUploadPreProcessor utilizando la API de plugins:
Manejadores de Carga
Los manejadores de carga no se escriben como plugins de Uppy; todavía funcionan como siempre con un cambio menor. Ahora, cuando un archivo coincide con una extensión registrada en un manejador de carga, todos los archivos que coinciden se enviarán a la vez. Anteriormente, solo se enviaba un archivo a la vez al manejador de carga, y ahora se envía una matriz en su lugar:
Los archivos manejados por un manejador de carga no se procesarán más en el pipeline de carga de Uppy. Los preprocesadores se ejecutan antes de que se invoquen los manejadores de carga.
Cargas Directas Multipart a S3
Anteriormente mencioné que nuestro uso de Uppy también nos permite realizar cargas multipart directas a S3 desde la interfaz de usuario. Para habilitar esta función, debe establecer la configuración del sitio enable_direct_s3_uploads en true.
Si está alojado con nosotros, los permisos S3 relevantes ya se han aplicado a su bucket. Sin embargo, si se autoaloja, hay varios permisos y reglas CORS que deben configurarse en su bucket para que esto funcione.
Para las reglas CORS, solo necesita ejecutar la tarea rake s3:ensure_cors_rules con rake s3:ensure_cors_rules. Agregará las siguientes reglas a su bucket siempre que tenga los permisos S3:GetBucketCors y S3:PutBucketCors habilitados para la clave de acceso y secreta que haya configurado para sus credenciales de S3 en su instancia de Discourse.
{
"AllowedHeaders": [
"Authorization",
"Content-Disposition",
"Content-Type"
],
"AllowedMethods": [
"GET",
"HEAD",
"PUT"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [
"ETag"
],
"MaxAgeSeconds": 3000
}
Para los permisos, deberá tener habilitados los siguientes permisos para la clave de acceso y secreta que haya configurado para sus credenciales de S3 en su instancia de Discourse.
{
"Sid": "YourSid",
"Effect": "Allow",
"Action": [
"s3:PutObjectVersionAcl",
"s3:PutObjectAcl",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:GetObject",
"s3:DeleteObject",
"s3:CreateMultipartUpload",
"s3:CompleteMultipartUpload",
"s3:AbortMultipartUpload"
],
"Resource": [
"YOUR_RESOURCE"
]
}
Este ha sido un proceso de varios meses y ¡aún no hemos terminado! Publicaré en este tema cuando estemos a punto de eliminar jQuery file uploader y resumable.js por completo de Discourse core. ¡Avísame si tienes alguna pregunta sobre lo que he publicado aquí!

