部署至AWS Lambda时openpyxl报“Bad offset for central directory”错误
解决FastAPI+openpyxl部署AWS Lambda后出现“Bad offset for central directory”错误
问题重现
本地基于FastAPI和openpyxl实现的Excel上传解析功能运行正常,但部署到AWS Lambda后,调用接口时抛出Bad offset for central directory错误,使用同一测试文件本地无异常。相关代码片段:
from openpyxl.reader.excel import load_workbook def upload_report(file: UploadFile = File(...)): contents = file.file.read() buffer = io.BytesIO(contents) wb = load_workbook(buffer, data_only=True) # 错误抛出位置 ...
环境:Python 3.12、fastapi 0.111.0、openpyxl 3.1.5
解决方案
方案1:手动重置BytesIO指针位置
读取文件内容后,强制将BytesIO的文件指针重置到开头,确保openpyxl从正确位置解析文件:
import io from openpyxl.reader.excel import load_workbook from fastapi import UploadFile, File def upload_report(file: UploadFile = File(...)): contents = file.file.read() buffer = io.BytesIO(contents) buffer.seek(0) # 新增:将指针重置到文件起始位置 wb = load_workbook(buffer, data_only=True) # 后续业务逻辑处理
方案2:使用shutil.copyfileobj复制文件流
避免直接读取UploadFile的file对象内容,改用shutil.copyfileobj将文件流复制到BytesIO中,适配Lambda环境下的文件对象实现:
import io import shutil from openpyxl.reader.excel import load_workbook from fastapi import UploadFile, File def upload_report(file: UploadFile = File(...)): buffer = io.BytesIO() shutil.copyfileobj(file.file, buffer) buffer.seek(0) # 重置指针到文件开头 wb = load_workbook(buffer, data_only=True) # 后续业务逻辑处理
原因分析
本地环境中,FastAPI的UploadFile对应的文件对象在读取后,底层实现可能自动重置了指针位置,或者文件流处理逻辑更宽松。但在AWS Lambda环境中,运行时对文件对象的处理存在差异,导致io.BytesIO初始化后指针停留在文件末尾,openpyxl读取时无法定位到Excel文件的中央目录结构,从而抛出偏移量错误。
通过手动重置指针或使用更可靠的文件流复制方式,能确保openpyxl从正确的起始位置解析Excel文件,解决该错误。
内容的提问来源于stack exchange,提问作者UserX
相关产品推荐
相关产品推荐

