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
相关产品推荐
相关产品推荐

