@martin 、迅速な回答ありがとうございます。
はい、貴社でホスティングしています。通常、ファイルをコンポーザーにドラッグすると、「処理中 <ファイル名>」のようなテキストがコンポーザーに挿入されます。また、API.addComposerUploadHandler([“mp4”, “mov”, “mkv”, “avi”, “m4v”]) を使用する場合、これは Discourse がファイルをカスタムハンドラーに渡す前に行われます。このプレースホルダーテキストの挿入は、ある時点で機能しなくなったため、ハンドラー内でコードを自分で挿入しました。
composerController.model.appEvents.trigger("composer:insert-block", `[処理中: ${file.name}...]()`);
次に壊れたのは、ビデオ拡張機能が「テーマで承認された拡張機能」設定から突然削除されたため、ハンドラーが起動しなくなったことです。または、再び機能させるためにそれらを再度追加する必要がありました。
その後、前述のように「複数」ファイルのドロップの問題を発見しました。
エラーメッセージが表示されずに 2 つ以上のファイルをドロップできるよう、ある程度機能していました。また、Discourse の検証ロジックをすべてバイパスしていたため、正しく感じられました。
関連するコードスニペットを以下に示します。
ここでは、Discourse がドロップされたファイルを渡してくれることを単純に期待しています。一度に 1 つずつ。
// ビデオ用のカスタムアップロードハンドラーを登録します。
api.addComposerUploadHandler(["mp4", "mov", "mkv", "avi", "m4v"], (file, editor) => {
console.log("アップロードを処理中:", file.name);
sendToGDrive(file, api);
})
Discourse がファイルを個別に渡してくれたため、配列を埋め、タイムアウト後に実際のアップローダー関数を起動する中間関数を作成しました。そのため、Discourse から渡されたファイルを独自の配列に収集しています。
// すべてのドロップされたファイルをシーケンスで収集します - Discourse ハンドラーによって報告されます。
function sendToGDrive(file, api) {
clearTimeout(uploaderStartTimeout);
filesHolder.push(file)
const composerController = api.container.lookup("controller:composer");
composerController.model.appEvents.trigger("composer:insert-block", `[処理中: ${file.name}...]()`);
uploaderStartTimeout = setTimeout(function () {
initFileSend(api);
}, 300);
}
次に、各ファイルを個別に Gdrive にアップロードします。
// 各ファイルを個別に処理します。
async function initFileSend(api) {
for (const file of filesHolder) {
const content = await sendFileToGdrive(file, api, uploadFolderId);
}
}
観察された問題点:
- 「複数ファイル」のドロップはファイルサイズ検証を引き起こしますが、単一ファイルのドロップは引き起こしません。