Sie haben in den letzten Monaten vielleicht viele Commits im Zusammenhang mit Uploads in Discourse Core bemerkt. Dies war Teil einer umfassenden Anstrengung innerhalb von Core, die Verwendung von jQuery File Upload aus unserer Codebasis zu ersetzen, als Teil einer noch breiteren Gesamtanstrengung, die Verwendung von jQuery selbst aus unserer Codebasis zu ersetzen. jQuery File Uploader ist ein sehr altes Projekt und war seit fast Beginn Teil von Discourse Core. Ich glaube, ich habe es auch in anderen Projekten während meiner gesamten Karriere verwendet. Aber es ist Zeit, Ol’ Reliable in den Ruhestand zu versetzen:
Wir haben jQuery File Upload ersetzt (und werden bald auch eine weitere Bibliothek, resumable.js, ersetzen) durch eine Bibliothek namens Uppy. Dies ist eine viel modernere Upload-Bibliothek, die einfach mit Plugins erweitert werden kann und in der Lage ist, alle verschiedenen Workflows zu verarbeiten, die wir ihr aufbürden. Wichtig ist, dass dies uns ermöglicht, direkte Multipart-Uploads von S3 vom Discourse-Client aus durchzuführen, anstatt große Dateien über unsere API senden zu müssen.
Der Composer verwendet jetzt Uppy für alle Uploads, und viele andere Stellen in der App verwenden es (Avatar-Uploads, Hintergrund-Uploads von Profilen usw.). Die letzten verbleibenden Stellen werden in den nächsten Wochen verschwinden. Dies sollte für die meisten Benutzer eine weitgehend unsichtbare Änderung sein, aber Autoren von Plugins und Theme-Komponenten müssen einige Änderungen vornehmen.
Plugin-API
Vorverarbeiter
Alle Upload-Vorverarbeiter müssen jetzt als Uppy-Plugin geschrieben werden. Diese Plugins sind ziemlich einfach zu schreiben und verwenden einen einfachen Promise-basierten Workflow. Ein Upload-Vorverarbeiter kann eine Datei ändern oder Metadaten hinzufügen, bevor Uppy sie nach S3 oder an den Endpunkt /uploads.json hochlädt. Wir haben bereits mehrere Vorverarbeiter im Core, die Sie als Referenz für das Schreiben Ihrer eigenen verwenden können:
- 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
Upload-Vorverarbeiter für den Composer werden über api.addComposerUploadPreProcessor unter Verwendung der Plugin-API registriert:
Upload-Handler
Upload-Handler werden nicht als Uppy-Plugins geschrieben; sie funktionieren weiterhin wie immer mit einer kleinen Änderung. Wenn eine Datei mit einer Erweiterung übereinstimmt, die für einen Upload-Handler registriert ist, werden alle übereinstimmenden Dateien auf einmal gesendet. Zuvor wurde nur eine Datei nach der anderen an den Upload-Handler gesendet, und jetzt wird stattdessen ein Array gesendet:
Dateien, die von einem Upload-Handler verarbeitet werden, werden in der Uppy-Upload-Pipeline nicht weiter verarbeitet. Vorverarbeiter werden ausgeführt, bevor Upload-Handler aufgerufen werden.
S3 Multipart Direct Uploads
Vorhin erwähnte ich, dass unsere Verwendung von Uppy es uns auch ermöglicht, direkte Multipart-Uploads von S3 aus der Benutzeroberfläche durchzuführen. Um diese Funktion zu aktivieren, müssen Sie die Site-Einstellung enable_direct_s3_uploads auf true setzen.
Wenn Sie bei uns gehostet werden, sind die relevanten S3-Berechtigungen bereits für Ihren Bucket angewendet. Wenn Sie jedoch selbst hosten, müssen mehrere Berechtigungen und CORS-Regeln auf Ihrem Bucket eingerichtet werden, damit dies funktioniert.
Für die CORS-Regeln müssen Sie nur die Rake-Aufgabe s3:ensure_cors_rules mit rake s3:ensure_cors_rules ausführen. Sie fügt Ihrem Bucket die folgenden Regeln hinzu, solange Sie über S3:GetBucketCors- und S3:PutBucketCors-Berechtigungen für den von Ihnen eingerichteten Zugangs- und geheimen Schlüssel für Ihre S3-Anmeldeinformationen in Ihrer Discourse-Instanz verfügen.
{
"AllowedHeaders": [
"Authorization",
"Content-Disposition",
"Content-Type"
],
"AllowedMethods": [
"GET",
"HEAD",
"PUT"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [
"ETag"
],
"MaxAgeSeconds": 3000
}
Für die Berechtigungen müssen Sie die folgenden Berechtigungen für den von Ihnen eingerichteten Zugangs- und geheimen Schlüssel für Ihre S3-Anmeldeinformationen in Ihrer Discourse-Instanz aktivieren.
{
"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"
]
}
Dies war ein Prozess, der mehrere lange Monate gedauert hat, und wir sind noch nicht fertig! Ich werde in diesem Thema posten, wenn wir jQuery File Uploader und resumable.js vollständig aus Discourse Core entfernen. Lassen Sie mich wissen, wenn Sie Fragen zu dem haben, was ich hier gepostet habe!

