Vous avez peut-être remarqué au cours des derniers mois de nombreux commits liés aux téléchargements dans le cœur de Discourse. Cela fait partie d’un effort global au sein du cœur pour remplacer les utilisations de jQuery file upload de notre base de code, dans le cadre d’un effort global encore plus large pour remplacer les utilisations de jQuery lui-même de notre base de code. jQuery file uploader est un très vieux projet, et fait partie du cœur de Discourse depuis presque le début. Je pense l’avoir utilisé pendant toute ma carrière dans d’autres projets également. Mais il est temps de retirer le bon vieux fiable :
Nous avons remplacé jQuery file upload (et remplacerons bientôt aussi une autre bibliothèque, resumable.js) par une bibliothèque appelée Uppy. Il s’agit d’une bibliothèque de téléchargement beaucoup plus moderne, facilement extensible avec des plugins et capable de gérer tous les différents flux de travail que nous lui imposons. Fait important, cela nous permet d’effectuer des téléchargements multipartites directs vers S3 depuis le client Discourse, plutôt que d’avoir à envoyer de gros fichiers via notre API.
Le compositeur utilise maintenant Uppy pour tous les téléchargements, et de nombreux autres endroits de l’application l’utilisent (téléchargements d’avatars, téléchargements d’arrière-plans de profil, etc.). Les derniers récalcitrants disparaîtront dans les prochaines semaines. Ce devrait être un changement largement invisible pour la plupart des utilisateurs, mais les auteurs de plugins et de composants de thème devront apporter quelques modifications.
API des plugins
Préprocesseurs
Tous les préprocesseurs de téléchargement doivent maintenant être écrits comme un plugin Uppy. Ces plugins sont assez simples à écrire et utilisent un flux de travail simple basé sur les promesses. Un préprocesseur de téléchargement peut modifier un fichier ou y ajouter des métadonnées avant qu’Uppy ne le télécharge vers S3 ou vers le point de terminaison /uploads.json. Nous avons déjà plusieurs préprocesseurs dans le cœur que vous pouvez utiliser comme référence lorsque vous écrivez les vôtres :
- 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
Les préprocesseurs de téléchargement pour le compositeur sont enregistrés via api.addComposerUploadPreProcessor en utilisant l’API des plugins :
Gestionnaires de téléchargement
Les gestionnaires de téléchargement ne sont pas écrits comme des plugins Uppy ; ils fonctionnent toujours comme ils l’ont toujours fait avec une modification mineure. Désormais, lorsqu’un fichier correspond à une extension enregistrée auprès d’un gestionnaire de téléchargement, tous les fichiers correspondants seront envoyés en même temps. Auparavant, un seul fichier à la fois était envoyé au gestionnaire de téléchargement, et un tableau est envoyé maintenant :
Les fichiers gérés par un gestionnaire de téléchargement ne seront pas traités davantage dans le pipeline de téléchargement Uppy. Les préprocesseurs sont exécutés avant l’invocation des gestionnaires de téléchargement.
Téléchargements directs multipartites S3
Plus tôt, j’ai mentionné que notre utilisation d’Uppy nous permet également d’effectuer des téléchargements multipartites directs vers S3 depuis l’interface utilisateur. Pour activer cette fonctionnalité, vous devez définir le paramètre de site enable_direct_s3_uploads sur true.
Si vous êtes hébergé chez nous, les autorisations S3 pertinentes sont déjà appliquées à votre bucket. Cependant, si vous auto-hébergez, plusieurs autorisations et règles CORS doivent être configurées sur votre bucket pour que cela fonctionne.
Pour les règles CORS, il vous suffit d’exécuter la tâche rake s3:ensure_cors_rules avec rake s3:ensure_cors_rules. Elle ajoutera les règles suivantes à votre bucket tant que vous disposez des autorisations S3:GetBucketCors et S3:PutBucketCors activées pour les clés d’accès et secrètes que vous avez configurées pour vos identifiants S3 sur votre instance Discourse.
{
"AllowedHeaders": [
"Authorization",
"Content-Disposition",
"Content-Type"
],
"AllowedMethods": [
"GET",
"HEAD",
"PUT"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [
"ETag"
],
"MaxAgeSeconds": 3000
}
Pour les autorisations, vous devrez avoir les autorisations suivantes activées pour les clés d’accès et secrètes que vous avez configurées pour vos identifiants S3 sur votre instance 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"
]
}
Ce processus a pris plusieurs longs mois et nous n’avons pas encore terminé ! Je publierai dans ce sujet lorsque nous serons sur le point de supprimer complètement jQuery file uploader et resumable.js du cœur de Discourse. Faites-moi savoir si vous avez des questions sur ce que j’ai posté ici !

