Lambda生成Excel经API网关传输后损坏,无法打开求助
问题原因及解决方案
核心问题分析
文件损坏由三个关键错误导致:
- Lambda返回的Base64编码是字节类型而非字符串,API网关传输时会出现编码异常;
- Lambda响应未设置正确的
Content-Type头部,导致API网关无法正确识别二进制媒体类型; - 前端创建File对象时指定了错误的MIME类型,导致文件格式标识错误。
修复步骤
1. 修正Lambda函数代码
需做两处修改:将Base64编码结果转为字符串,添加正确的Content-Type头部。
修改后的Lambda代码:
import json import io import base64 from openpyxl import Workbook data = [ ["HEAD1", "Head2"], ["hello", "operating_system"], ["durablility", "material"], ["longevity", "item_name"], ] def lambda_handler(event, context): wb = Workbook() ws = wb.active for r in data: ws.append(r) buffer = io.BytesIO() wb.save(buffer) excel_final = buffer.getvalue() buffer.close() return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Origin': '*', # 添加正确的Excel MIME类型 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }, # 将bytes类型的Base64编码转为字符串 'body': base64.b64encode(excel_final).decode('utf-8'), 'isBase64Encoded': True }
2. 修正前端代码
修改File对象的type参数,匹配正确的Excel MIME类型:
修改后的前端代码:
const requestOptions = { method: 'GET', headers: { 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }, }; fetch(url, requestOptions) .then(response => { if (response.ok) { return response.arrayBuffer(); } }) .then(blob => { // 修正MIME类型为正确的Excel格式类型 const file = new File([blob], "demo.xlsx", {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}) const link = document.createElement('a') const url = URL.createObjectURL(file) link.href = url link.download = file.name document.body.appendChild(link) link.click() // 清理URL对象,避免内存泄漏 URL.revokeObjectURL(url) document.body.removeChild(link) })
3. 验证API网关配置
确保API网关的二进制媒体类型已正确添加application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,并且部署了最新的API配置。
验证方法
修改完成后重新部署Lambda函数和API网关,前端发起请求下载文件,此时应该可以正常打开Excel文件。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

