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

部署至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:26:14