You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sqlalchemy-file的FileField无法自定义文件名,默认存为unnamed的修复求助

解决sqlalchemy-file FileField存储文件时文件名显示为unnamed的问题

你当前的代码直接将文件内容(bytes对象)传入FileField,sqlalchemy-file无法获取文件的原始名称和内容类型,因此默认使用unnamed作为文件名,application/octet-stream作为内容类型。以下是两种修复方案:

方案1:直接传入UploadFile对象

无需手动读取文件内容,直接将FastAPI的UploadFile实例传给FileField,sqlalchemy-file会自动提取文件名、内容类型等信息:

修改上传接口代码:

@router.post("doc_upload")
async def document_upload(
    user_file: UploadFile = File(...),
    db: Session = Depends(deps.get_db),
):
    try:
        # 直接传入UploadFile实例
        db_document = UserDoc(file=user_file)
        db.add(db_document)
        db.commit()
        db.refresh(db_document)
    except Exception as _:
        # 异常处理逻辑

方案2:用File类包装文件内容(适用于需要先处理内容的场景)

如果必须先读取文件内容进行处理,可以使用sqlalchemy-file提供的File类来包装内容,手动指定文件名和内容类型:

首先导入File类:

from sqlalchemy_file import FileField, File

然后修改接口代码:

@router.post("doc_upload")
async def document_upload(
    user_file: UploadFile = File(...),
    db: Session = Depends(deps.get_db),
):
    try:
        file_contents = await user_file.read()
        # 用File类包装内容,传入原始文件名和内容类型
        document_data = {
            "file": File(
                content=file_contents,
                filename=user_file.filename,
                content_type=user_file.content_type
            )
        }
        db_document = UserDoc(**document_data)
        db.add(db_document)
        db.commit()
        db.refresh(db_document)
    except Exception as _:
        # 异常处理逻辑

验证效果

修改完成后,数据库中存储的文件记录里,filename会显示为上传时的原始文件名,content_type也会匹配文件实际类型,下载时就能正确显示自定义的文件名了。

内容的提问来源于stack exchange,提问作者Avin Mathew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:05:06