限制文件大小 20M
This commit is contained in:
parent
ff27395f3a
commit
333fb2e4a2
|
|
@ -13,6 +13,7 @@ from utils.helpers import BaseResponse
|
||||||
from logger.logging import get_logger
|
from logger.logging import get_logger
|
||||||
from core.dependencies import get_current_user
|
from core.dependencies import get_current_user
|
||||||
from models.user import User
|
from models.user import User
|
||||||
|
from core.config import settings
|
||||||
from core.database import get_db_pool
|
from core.database import get_db_pool
|
||||||
from services.chat_thread_file_service import ChatThreadFileService
|
from services.chat_thread_file_service import ChatThreadFileService
|
||||||
from services.vector_service import get_vector_service
|
from services.vector_service import get_vector_service
|
||||||
|
|
@ -247,11 +248,6 @@ async def process_chat_file_background(
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# 限制内容长度,避免 token 超限
|
|
||||||
max_content_length = 10000 # 约 3000-4000 tokens
|
|
||||||
if len(file_content) > max_content_length:
|
|
||||||
file_content = file_content[:max_content_length] + "..."
|
|
||||||
|
|
||||||
logger.info(f"正在为文件 {file_id} 生成摘要,内容长度: {len(file_content)} 字符")
|
logger.info(f"正在为文件 {file_id} 生成摘要,内容长度: {len(file_content)} 字符")
|
||||||
|
|
||||||
# 将文本内容转换为 Document 对象
|
# 将文本内容转换为 Document 对象
|
||||||
|
|
@ -429,13 +425,16 @@ async def upload_chat_file(
|
||||||
file_size = len(content)
|
file_size = len(content)
|
||||||
file_size_mb = file_size / (1024 * 1024)
|
file_size_mb = file_size / (1024 * 1024)
|
||||||
|
|
||||||
# 检查文件大小(限制 15MB)
|
# 检查文件大小
|
||||||
MAX_FILE_SIZE = 15 * 1024 * 1024 # 15MB
|
max_file_size = settings.max_upload_file_bytes
|
||||||
if file_size > MAX_FILE_SIZE:
|
max_file_size_mb = max_file_size / (1024 * 1024)
|
||||||
logger.warning(f"❌ 文件大小超限: {file_size_mb:.2f}MB (最大 15MB), 文件: {file.filename}")
|
if file_size > max_file_size:
|
||||||
|
logger.warning(
|
||||||
|
f"❌ 文件大小超限: {file_size_mb:.2f}MB (最大 {max_file_size_mb:.0f}MB), 文件: {file.filename}"
|
||||||
|
)
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=status.HTTP_400_BAD_REQUEST,
|
status_code=status.HTTP_400_BAD_REQUEST,
|
||||||
detail=f"文件大小超过限制,当前: {file_size_mb:.2f}MB,最大允许: 15MB"
|
detail=f"文件大小超过限制,当前: {file_size_mb:.2f}MB,最大允许: {max_file_size_mb:.0f}MB"
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info(f"✅ 文件大小验证通过: {file_size_mb:.2f}MB ({file_size} bytes)")
|
logger.info(f"✅ 文件大小验证通过: {file_size_mb:.2f}MB ({file_size} bytes)")
|
||||||
|
|
|
||||||
|
|
@ -340,11 +340,16 @@ async def upload_file(
|
||||||
file_size = len(content)
|
file_size = len(content)
|
||||||
file_size_mb = file_size / (1024 * 1024)
|
file_size_mb = file_size / (1024 * 1024)
|
||||||
|
|
||||||
# 检查文件大小(限制 15MB)
|
# 检查文件大小
|
||||||
MAX_FILE_SIZE = 15 * 1024 * 1024 # 15MB
|
max_file_size = settings.max_upload_file_bytes
|
||||||
if file_size > MAX_FILE_SIZE:
|
max_file_size_mb = max_file_size / (1024 * 1024)
|
||||||
logger.warning(f"❌ 文件大小超限: {file_size_mb:.2f}MB (最大 15MB), 文件: {file.filename}")
|
if file_size > max_file_size:
|
||||||
raise BadRequestError(f"文件大小超过限制,当前: {file_size_mb:.2f}MB,最大允许: 15MB")
|
logger.warning(
|
||||||
|
f"❌ 文件大小超限: {file_size_mb:.2f}MB (最大 {max_file_size_mb:.0f}MB), 文件: {file.filename}"
|
||||||
|
)
|
||||||
|
raise BadRequestError(
|
||||||
|
f"文件大小超过限制,当前: {file_size_mb:.2f}MB,最大允许: {max_file_size_mb:.0f}MB"
|
||||||
|
)
|
||||||
|
|
||||||
logger.info(f"✅ 文件大小验证通过: {file_size_mb:.2f}MB ({file_size} bytes)")
|
logger.info(f"✅ 文件大小验证通过: {file_size_mb:.2f}MB ({file_size} bytes)")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,8 +31,6 @@ logger = get_logger(__name__)
|
||||||
|
|
||||||
knowledge_graph_router = APIRouter(prefix="/api/knowledge-graph", tags=["知识图谱"])
|
knowledge_graph_router = APIRouter(prefix="/api/knowledge-graph", tags=["知识图谱"])
|
||||||
|
|
||||||
MAX_UPLOAD_BYTES = 15 * 1024 * 1024
|
|
||||||
|
|
||||||
|
|
||||||
async def _knowledge_graph_build_task(record_id: int, neo4j_gid: str, text: str) -> None:
|
async def _knowledge_graph_build_task(record_id: int, neo4j_gid: str, text: str) -> None:
|
||||||
pool = await get_db_pool()
|
pool = await get_db_pool()
|
||||||
|
|
@ -135,8 +133,10 @@ async def create_knowledge_graph(
|
||||||
raise HTTPException(status_code=400, detail="请上传文件")
|
raise HTTPException(status_code=400, detail="请上传文件")
|
||||||
|
|
||||||
raw = await file.read()
|
raw = await file.read()
|
||||||
if len(raw) > MAX_UPLOAD_BYTES:
|
max_upload_bytes = settings.max_upload_file_bytes
|
||||||
raise HTTPException(status_code=400, detail="文件过大,请控制在 15MB 以内")
|
max_upload_mb = max_upload_bytes / (1024 * 1024)
|
||||||
|
if len(raw) > max_upload_bytes:
|
||||||
|
raise HTTPException(status_code=400, detail=f"文件过大,请控制在 {max_upload_mb:.0f}MB 以内")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
text = await extract_knowledge_document_text(file.filename, raw)
|
text = await extract_knowledge_document_text(file.filename, raw)
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,9 @@ class Settings(BaseSettings):
|
||||||
# HTTPX 配置
|
# HTTPX 配置
|
||||||
httpx_default_timeout: float = 300.0
|
httpx_default_timeout: float = 300.0
|
||||||
|
|
||||||
|
# 文件上传(知识库、聊天、知识图谱等共用)
|
||||||
|
max_upload_file_bytes: int = 20 * 1024 * 1024 # 单文件上限 20MB
|
||||||
|
|
||||||
# Redis 配置
|
# Redis 配置
|
||||||
redis_host: str = "127.0.0.1"
|
redis_host: str = "127.0.0.1"
|
||||||
redis_port: int = 6379
|
redis_port: int = 6379
|
||||||
|
|
|
||||||
|
|
@ -2114,10 +2114,10 @@ function handleFileSelect(event) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查文件大小(100MB)
|
// 检查文件大小(20MB)
|
||||||
const maxSize = 100 * 1024 * 1024
|
const maxSize = 20 * 1024 * 1024
|
||||||
if (file.size > maxSize) {
|
if (file.size > maxSize) {
|
||||||
alert('文件大小不能超过 100MB')
|
alert('文件大小不能超过 20MB')
|
||||||
event.target.value = ''
|
event.target.value = ''
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -216,7 +216,7 @@
|
||||||
ref="fileInput"
|
ref="fileInput"
|
||||||
>
|
>
|
||||||
</label>
|
</label>
|
||||||
<small class="upload-hint">支持 PDF、DOCX、Excel(xlsx/xls)、CSV、TXT、图片(PNG、JPG、BMP)格式,单文件不超过 15MB,提取正文不超过 300 万字(过长请拆分)</small>
|
<small class="upload-hint">支持 PDF、DOCX、Excel(xlsx/xls)、CSV、TXT、图片(PNG、JPG、BMP)格式,单文件不超过 20MB,提取正文不超过 300 万字(过长请拆分)</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- URL 上传 -->
|
<!-- URL 上传 -->
|
||||||
|
|
@ -1103,10 +1103,10 @@ function handleFileSelect(event) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查文件大小(限制 100MB)
|
// 检查文件大小(限制 20MB)
|
||||||
const maxSize = 100 * 1024 * 1024
|
const maxSize = 20 * 1024 * 1024
|
||||||
if (file.size > maxSize) {
|
if (file.size > maxSize) {
|
||||||
alert('文件大小不能超过 100MB')
|
alert('文件大小不能超过 20MB')
|
||||||
event.target.value = ''
|
event.target.value = ''
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -219,7 +219,7 @@
|
||||||
class="form-control bg-dark text-white border-secondary"
|
class="form-control bg-dark text-white border-secondary"
|
||||||
@change="onFileSelect"
|
@change="onFileSelect"
|
||||||
/>
|
/>
|
||||||
<div class="mt-2 small text-muted">支持 .txt、.pdf、.docx 及常见图片;扫描件将尝试 OCR + 通义视觉。单文件不超过约 15MB,提取正文不超过 300 万字(过长请拆分)</div> </div>
|
<div class="mt-2 small text-muted">支持 .txt、.pdf、.docx 及常见图片;扫描件将尝试 OCR + 通义视觉。单文件不超过 20MB,提取正文不超过 300 万字(过长请拆分)</div> </div>
|
||||||
<div v-if="uploadError" class="alert alert-danger py-2 small">{{ uploadError }}</div>
|
<div v-if="uploadError" class="alert alert-danger py-2 small">{{ uploadError }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer-custom">
|
<div class="modal-footer-custom">
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue