|
|
|
@ -15,7 +15,7 @@ |
|
|
|
<!-- 上传模式 Tab --> |
|
|
|
<t-tabs v-model="uploadMode"> |
|
|
|
<t-tab-panel value="file" label="📄 文件上传"> |
|
|
|
<t-upload :auto-upload="false" theme="file-flow" :before-upload="beforeFileUpload" |
|
|
|
<t-upload :auto-upload="false" theme="file-flow" multiple :before-upload="beforeFileUpload" |
|
|
|
:request-method="handleFileUpload" accept=".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.md,.json,.csv,.html,.xml,.rtf" |
|
|
|
:size-limit="{ size: 50, unit: 'MB', message: '文件大小不能超过 50MB' }" /> |
|
|
|
</t-tab-panel> |
|
|
|
@ -36,9 +36,10 @@ |
|
|
|
|
|
|
|
<script setup lang="ts"> |
|
|
|
import { ref, computed } from 'vue' |
|
|
|
import type { UploadFile } from 'tdesign-vue-next' |
|
|
|
import { useCategoryStore } from '@/stores/category' |
|
|
|
import { useDocumentStore } from '@/stores/document' |
|
|
|
import { uploadFile, uploadMarkdown } from '@/api/upload' |
|
|
|
import { uploadFile, uploadMarkdown, uploadJsonBasic } from '@/api/upload' |
|
|
|
import { toast } from '@/utils/toast' |
|
|
|
|
|
|
|
const categoryStore = useCategoryStore() |
|
|
|
@ -87,41 +88,46 @@ function beforeFileUpload(file: File): boolean { |
|
|
|
return true |
|
|
|
} |
|
|
|
|
|
|
|
async function handleFileUpload(req: { file: File; onProgress?: (e: { percent: number }) => void; onSuccess: () => void; onError: () => void }) { |
|
|
|
/** 从 TDesign requestMethod 入参中取出原始 File(单文件为 UploadFile,多文件为数组) */ |
|
|
|
function pickRawFile(file: UploadFile | UploadFile[]): File | undefined { |
|
|
|
const f = Array.isArray(file) ? file[0] : file |
|
|
|
return f?.raw |
|
|
|
} |
|
|
|
|
|
|
|
async function handleFileUpload(file: UploadFile | UploadFile[]) { |
|
|
|
try { |
|
|
|
const fd = buildFormData(req.file) |
|
|
|
await uploadFile(fd, (pct) => { if (req.onProgress) req.onProgress({ percent: pct }) }) |
|
|
|
req.onSuccess() |
|
|
|
const raw = pickRawFile(file) |
|
|
|
if (!raw) return { status: 'fail', error: '未获取到文件', response: {} } |
|
|
|
const fd = buildFormData(raw) |
|
|
|
await uploadFile(fd) |
|
|
|
toast('上传成功,文档正在处理中', 'success') |
|
|
|
documentStore.loadStats() |
|
|
|
} catch (e: any) { req.onError(); toast('上传失败:' + e.message, 'error') } |
|
|
|
return { status: 'success', response: {} } |
|
|
|
} catch (e: any) { toast('上传失败:' + e.message, 'error'); return { status: 'fail', error: e.message, response: {} } } |
|
|
|
} |
|
|
|
|
|
|
|
async function handleMdUpload(req: { file: File; onProgress?: (e: { percent: number }) => void; onSuccess: () => void; onError: () => void }) { |
|
|
|
async function handleMdUpload(file: UploadFile | UploadFile[]) { |
|
|
|
try { |
|
|
|
const fd = buildFormData(req.file) |
|
|
|
await uploadMarkdown(fd, (pct) => { if (req.onProgress) req.onProgress({ percent: pct }) }) |
|
|
|
req.onSuccess() |
|
|
|
const raw = pickRawFile(file) |
|
|
|
if (!raw) return { status: 'fail', error: '未获取到文件', response: {} } |
|
|
|
const fd = buildFormData(raw) |
|
|
|
await uploadMarkdown(fd) |
|
|
|
toast('Markdown 上传成功', 'success') |
|
|
|
documentStore.loadStats() |
|
|
|
} catch (e: any) { req.onError(); toast('上传失败:' + e.message, 'error') } |
|
|
|
return { status: 'success', response: {} } |
|
|
|
} catch (e: any) { toast('上传失败:' + e.message, 'error'); return { status: 'fail', error: e.message, response: {} } } |
|
|
|
} |
|
|
|
|
|
|
|
async function handleJsonUpload(req: { file: File; onProgress?: (e: { percent: number }) => void; onSuccess: () => void; onError: () => void }) { |
|
|
|
// JSON 上传使用 fetch |
|
|
|
async function handleJsonUpload(file: UploadFile | UploadFile[]) { |
|
|
|
try { |
|
|
|
const fd = buildFormData(req.file) |
|
|
|
const xhr = new XMLHttpRequest() |
|
|
|
xhr.open('POST', '/upload/json/basic') |
|
|
|
const token = localStorage.getItem('sb_token') || '' |
|
|
|
if (token) xhr.setRequestHeader('Authorization', 'Bearer ' + token) |
|
|
|
xhr.upload.addEventListener('progress', (e) => { |
|
|
|
if (e.lengthComputable && req.onProgress) req.onProgress({ percent: Math.round((e.loaded / e.total) * 100) }) |
|
|
|
}) |
|
|
|
xhr.addEventListener('load', () => { req.onSuccess(); toast('JSON 上传成功', 'success'); documentStore.loadStats() }) |
|
|
|
xhr.addEventListener('error', () => { req.onError(); toast('上传失败', 'error') }) |
|
|
|
xhr.send(fd) |
|
|
|
} catch (e: any) { req.onError(); toast('上传失败:' + e.message, 'error') } |
|
|
|
const raw = pickRawFile(file) |
|
|
|
if (!raw) return { status: 'fail', error: '未获取到文件', response: {} } |
|
|
|
const fd = buildFormData(raw) |
|
|
|
await uploadJsonBasic(fd) |
|
|
|
toast('JSON 上传成功', 'success') |
|
|
|
documentStore.loadStats() |
|
|
|
return { status: 'success', response: {} } |
|
|
|
} catch (e: any) { toast('上传失败:' + e.message, 'error'); return { status: 'fail', error: e.message, response: {} } } |
|
|
|
} |
|
|
|
|
|
|
|
async function uploadText() { |
|
|
|
|