Potresti aver notato negli ultimi mesi molti commit relativi ai caricamenti in Discourse core. Questo fa parte di uno sforzo generale all’interno del core per sostituire gli utilizzi di jQuery file upload dal nostro codebase, come parte di uno sforzo generale ancora più ampio per sostituire gli utilizzi di jQuery stesso dal nostro codebase. jQuery file uploader è un progetto molto vecchio ed è stato parte di Discourse core fin quasi dall’inizio. Penso di averlo usato per tutta la mia carriera anche in altri progetti. Ma è ora di ritirare il vecchio affidabile:
Abbiamo sostituito jQuery file upload (e presto sostituiremo anche un’altra libreria, resumable.js) con una libreria chiamata Uppy. Questa è una libreria di caricamento molto più moderna, facilmente estendibile con plugin e in grado di gestire tutti i diversi flussi di lavoro che le proponiamo. Importante, questo ci permette di effettuare caricamenti multipart diretti su S3 dal client Discourse, piuttosto che dover inviare file di grandi dimensioni attraverso la nostra API.
Il composer ora utilizza Uppy per tutti i caricamenti e molti altri punti dell’app lo utilizzano (caricamenti avatar, caricamenti sfondo profilo, ecc.). Gli ultimi ritardatari saranno eliminati nelle prossime settimane. Questo dovrebbe essere un cambiamento in gran parte invisibile per la maggior parte degli utenti, ma gli autori di plugin e componenti tema dovranno apportare alcune modifiche.
API Plugin
Preprocessori
Tutti i preprocessori di caricamento devono ora essere scritti come plugin Uppy. Questi plugin sono piuttosto semplici da scrivere e utilizzano un semplice flusso di lavoro basato su promise. Un preprocessore di caricamento può modificare un file o aggiungere metadati prima che Uppy lo carichi su S3 o sull’endpoint /uploads.json. Abbiamo già diversi preprocessori nel core che puoi usare come riferimento quando scrivi i tuoi:
- 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
I preprocessori di caricamento per il composer sono registrati tramite api.addComposerUploadPreProcessor utilizzando l’API dei plugin:
Gestori di Caricamento
I gestori di caricamento non sono scritti come plugin Uppy; funzionano ancora come sempre con una piccola modifica. Ora, quando un file corrisponde a un’estensione registrata per un gestore di caricamento, tutti i file corrispondenti verranno inviati contemporaneamente. In precedenza, solo un file alla volta veniva inviato al gestore di caricamento, e ora viene inviato un array:
I file gestiti da un gestore di caricamento non verranno ulteriormente elaborati nella pipeline di caricamento di Uppy. I preprocessori vengono eseguiti prima che vengano invocati i gestori di caricamento.
Caricamenti Diretti Multipart S3
In precedenza ho menzionato che il nostro utilizzo di Uppy ci consente anche di effettuare caricamenti multipart diretti su S3 dall’interfaccia utente. Per abilitare questa funzionalità, è necessario impostare l’impostazione del sito enable_direct_s3_uploads su true.
Se sei ospitato con noi, le autorizzazioni S3 pertinenti sono già state applicate al tuo bucket. Tuttavia, se stai auto-ospitando, ci sono diverse autorizzazioni e regole CORS che devono essere impostate sul tuo bucket affinché ciò funzioni.
Per le regole CORS, devi solo eseguire il task rake s3:ensure_cors_rules con rake s3:ensure_cors_rules. Aggiungerà le seguenti regole al tuo bucket finché avrai le autorizzazioni S3:GetBucketCors e S3:PutBucketCors abilitate per qualsiasi chiave di accesso e segreta tu abbia impostato per le tue credenziali S3 sulla tua istanza Discourse.
{
"AllowedHeaders": [
"Authorization",
"Content-Disposition",
"Content-Type"
],
"AllowedMethods": [
"GET",
"HEAD",
"PUT"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [
"ETag"
],
"MaxAgeSeconds": 3000
}
Per le autorizzazioni, dovrai avere le seguenti autorizzazioni abilitate per qualsiasi chiave di accesso e segreta tu abbia impostato per le tue credenziali S3 sulla tua istanza 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"
]
}
Questo è stato un processo che ha richiesto diversi lunghi mesi e non abbiamo ancora finito! Posterò in questo topic quando saremo pronti a rimuovere completamente jQuery file uploader e resumable.js da Discourse core. Fammi sapere se hai domande su ciò che ho pubblicato qui!

