REFERENCE
SDK 範例
@asgard-js/core 與 @asgard-js/react 的用法與可以直接操作的範例。
檔案上傳與拖放
<Chatbot> 內建圖片與文件上傳,使用者也可以直接把檔案拖放進聊天視窗。
下方 demo 連到真實的 bot provider,所以你可以實際選檔、預覽、拖放。
資訊
上傳需要真實的 botProviderEndpoint。在 preview mode(botProviderEndpoint: "skip")下,
上傳按鈕仍會顯示,但輸入框會被停用、檔案不會真的上傳。
兩個上傳開關
Prop 在 footer 顯示 接受的檔案 enableUpload圖片上傳按鈕 JPEG / JPG / PNG / GIF / WebP enableDocumentUpload文件上傳按鈕 PDF、Office、CSV、PPT、MP3 / MP4、HTML / XML / TXT / JSON 當同時啟用 3 個以上的按鈕(含
enableExport)時,footer 會把它們摺疊成一個「+」選單。檔案限制
類型 允許的格式 單檔上限 數量上限 圖片 JPEG / JPG / PNG / GIF / WebP 20MB 10 張 文件 PDF、Office、CSV、PPT、MP3 / MP4、HTML / XML / TXT / JSON 20MB 10 個 超過限制的檔案會被擋下並顯示錯誤提示。
限制可上傳的 MIME 類型
預設會接受上表所有格式。若只想開放部分類型,可傳入
allowedImageMimeTypes(搭配enableUpload)與allowedDocumentMimeTypes(搭配enableDocumentUpload)。下方 demo 為 preview 模式,切換 preset 後打開聊天視窗的附件選單,檔案選擇器只會顯示對應格式:<Chatbot
// ...
enableUpload
enableDocumentUpload
allowedImageMimeTypes={["image/png", "image/jpeg"]} // 圖片只開放 PNG / JPEG
allowedDocumentMimeTypes={["application/pdf"]} // 文件只開放 PDF
/>行為重點:
- 是「覆蓋」不是「合併」:一旦給值就完全取代預設清單,並同時套用到檔案選擇器的
accept與上傳驗證。 - 可填預設清單以外的類型,例如
["image/svg+xml"],值會原樣使用。 - 空陣列等同未指定,沿用預設清單。
- ⚠️ 文件的判斷方式不同:未指定時,驗證會用「MIME 比對 或 副檔名 fallback」(因應某些瀏覽器回傳空 MIME);一旦指定
allowedDocumentMimeTypes,就只比對 MIME、不再做副檔名 fallback,請填入精確的 MIME(例如application/pdf)。
- 是「覆蓋」不是「合併」:一旦給值就完全取代預設清單,並同時套用到檔案選擇器的
送出訊息時會夾帶什麼
使用者選檔後,SDK 會立即非同步上傳,並在輸入框上方顯示預覽(圖片縮圖/文件清單)。 送出訊息時,這些資訊會放進
SendMessageParams:欄位 說明 blobIds上傳成功的檔案 blob id(圖片與文件皆有) filePreviewUrls圖片的本地預覽 URL documentNames文件的原始檔名 你可以用
onBeforeSendMessage在送出前讀取或修改這些欄位。程式範例
import { Chatbot } from "@asgard-js/react";
export function Demo() {
return (
<Chatbot
title="檔案上傳 Demo"
config={{ botProviderEndpoint: BOT_PROVIDER_ENDPOINT }}
customChannelId="file-upload-demo"
enableUpload
enableDocumentUpload
/>
);
}自訂拖放:
useFileDropContext拖放行為由
<Chatbot>內建處理:拖曳檔案到視窗上方時會顯示拖放區覆蓋層, 放開後檔案會自動分類成圖片/文件並進入上傳流程。如果你做了自訂 footer 或想自行接管拖放區,可以用
useFileDropContext:import { useFileDropContext } from "@asgard-js/react";
function CustomDropZone() {
const {
droppedFiles,
isDraggingOver,
setDroppedFiles,
setIsDraggingOver,
clearDroppedFiles,
} = useFileDropContext();
// isDraggingOver:使用者是否正拖曳檔案到視窗上方
// droppedFiles:放開後的 File[]
// setDroppedFiles / clearDroppedFiles:自行注入或清空待處理檔案
return null;
}欄位 / 方法 說明 droppedFiles目前拖放進來、待處理的 File[]isDraggingOver使用者是否正拖曳檔案到視窗上方 setDroppedFiles以程式設定待處理檔案 setIsDraggingOver以程式設定拖曳狀態(自訂覆蓋層用) clearDroppedFiles清空待處理檔案