過去数ヶ月にわたり、Discourseコアのアップロードに関連する多くのコミットに気づいたかもしれません。これは、コードベースからのjQuery file uploadの使用を置き換えるためのコア内の全体的な取り組みの一環であり、さらに広範な、コードベースからのjQuery自体の使用を置き換えるための全体的な取り組みの一部です。jQuery file uploaderは非常に古いプロジェクトであり、ほぼ最初からDiscourseコアの一部でした。私も他のプロジェクトでキャリア全体でそれを使用してきたと思います。しかし、Ol’ Reliableを引退する時が来ました。
jQuery file upload(そしてまもなく別のライブラリであるresumable.jsも置き換えます)をUppyというライブラリに置き換えました。これは、プラグインで簡単に拡張でき、私たちが投げるさまざまなワークフローをすべて処理できる、はるかにモダンなアップロードライブラリです。重要なのは、これにより、大きなファイルをAPI経由で送信するのではなく、DiscourseクライアントからS3に直接マルチパートアップロードできるようになることです。
コンポーザーは現在すべてのアップロードにUppyを使用しており、アプリ内の他の多くの場所(アバターアップロード、プロファイル背景アップロードなど)でも使用されています。最後の数週間で、残りの部分も削除される予定です。これはほとんどのユーザーにとってはほとんど目に見えない変更になるはずですが、プラグインおよびテーマコンポーネントの作成者はいくつかの変更を行う必要があります。
プラグインAPI
事前処理プログラム
すべてのアップロード事前処理プログラムは、Uppyプラグインとして記述する必要があります。これらのプラグインは非常に簡単に記述でき、単純なPromiseベースのワークフローを使用します。アップロード事前処理プログラムは、UppyがファイルをS3または/uploads.jsonエンドポイントにアップロードする前に、ファイルを変更したり、メタデータを追加したりできます。すでにコアにいくつかの事前処理プログラムがあり、独自のものを記述する際の参考として使用できます。
- 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
コンポーザーのアップロード事前処理プログラムは、プラグインAPIを使用してapi.addComposerUploadPreProcessorを介して登録されます。
アップロードハンドラー
アップロードハンドラーはUppyプラグインとして記述されていません。それらは、マイナーな変更を加えて、これまでどおり機能します。ファイルがアップロードハンドラーに登録された拡張子に一致すると、一致するすべてのファイルが一度に送信されます。以前は一度に1つのファイルのみがアップロードハンドラーに送信されていましたが、現在は配列が送信されます。
アップロードハンドラーによって処理されたファイルは、Uppyのアップロードパイプラインでさらに処理されません。事前処理プログラムは、アップロードハンドラーが呼び出される前に実行されます。
S3マルチパート直接アップロード
先ほど、Uppyの使用により、UIからS3への直接マルチパートアップロードも可能になると述べました。この機能を有効にするには、enable_direct_s3_uploadsサイト設定をtrueに設定する必要があります。
当社でホストされている場合、関連するS3権限はすでにバケットに適用されています。ただし、セルフホストしている場合は、これが機能するためにバケットに設定する必要があるいくつかの権限とCORSルールがあります。
CORSルールについては、s3:ensure_cors_rules rakeタスクをrake s3:ensure_cors_rulesで実行するだけで済みます。これにより、Discourseインスタンスに設定されているS3認証情報に使用するアクセスキーとシークレットキーにS3:GetBucketCorsおよびS3:PutBucketCors権限が有効になっている限り、バケットに次のルールが追加されます。
{
"AllowedHeaders": [
"Authorization",
"Content-Disposition",
"Content-Type"
],
"AllowedMethods": [
"GET",
"HEAD",
"PUT"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [
"ETag"
],
"MaxAgeSeconds": 3000
}
権限については、Discourseインスタンスに設定されているS3認証情報に使用するアクセスキーとシークレットキーに、次の権限が有効になっている必要があります。
{
"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"
]
}
これは数ヶ月にわたるプロセスであり、まだ完了していません!jQuery file uploaderとresumable.jsをDiscourseコアから完全に削除する準備ができたときに、このトピックで投稿します。ここに投稿した内容について質問があればお知らせください!

