@martin 님, 빠른 답변 감사합니다.
네, 저희는 Discourse를 호스팅하고 있습니다. 보통 파일을 컴포저에 드래그 앤 드롭하면 "Processing "과 같은 텍스트가 컴포저에 삽입됩니다. 또한 API.addComposerUploadHandler(["mp4", "mov", "mkv", "avi", "m4v"])를 사용하는 경우, 이는 Discourse가 파일을 커스텀 핸들러로 전달하기 전에 수행하는 동작입니다. 그러나 어느 시점부터 이 플레이스홀더 텍스트 삽입이 작동하지 않게 되었는데, 제 핸들러에 아래 코드를 직접 삽입했을 때부터였습니다:
composerController.model.appEvents.trigger("composer:insert-block", `[Processing: ${file.name}...]()`);
그다음으로 문제가 된 것은, 갑자기 “theme authorized extensions” 설정에서 해당 비디오 확장자가 사라지면서 제 핸들러가 실행되지 않게 된 것이었습니다. 다시 설정에 추가해야만 정상적으로 작동하기 시작했습니다.
이후에 앞서 설명드린 “다중 파일 드롭” 문제를 발견했습니다.
저희는 2개 이상의 파일을 드롭했을 때 에러 메시지가 뜨지 않도록 작동하도록 설정한 적이 있습니다. 이는 Discourse의 모든 검증 로직을 우회했기 때문에 올바른 방식이라고 느껴졌습니다.
관련 코드 스니펫은 다음과 같습니다:
여기서는 단순히 Discourse가 드롭된 파일들을 하나씩 전달해주기를 기대합니다.
// Register custom upload handler for videos.
api.addComposerUploadHandler(["mp4", "mov", "mkv", "avi", "m4v"], (file, editor) => {
console.log("Handling upload for", file.name);
sendToGDrive(file, api);
})
Discourse가 파일을 개별적으로 전달해주었기 때문에, 중간 매개 함수를 만들어 배열을 채우고 타임아웃이 지난 후 실제 업로더 함수를 실행하도록 했습니다. 즉, Discourse에서 전달받은 파일을 제 배열에 수집하는 방식입니다.
// Collect all dropped files in sequence - as reported by Discourse handler.
function sendToGDrive(file, api) {
clearTimeout(uploaderStartTimeout);
filesHolder.push(file)
const composerController = api.container.lookup("controller:composer");
composerController.model.appEvents.trigger("composer:insert-block", `[Processing: ${file.name}...]()`);
uploaderStartTimeout = setTimeout(function () {
initFileSend(api);
}, 300);
}
그 다음 각 파일을 개별적으로 Gdrive로 업로드합니다.
// Handle every file individually.
async function initFileSend(api) {
for (const file of filesHolder) {
const content = await sendFileToGdrive(file, api, uploadFolderId);
}
}
관찰된 문제점:
- “다중 파일” 드롭 시에는 파일 크기 검증이 이루어지지만, 단일 파일 드롭 시에는 그렇지 않습니다