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

使用Requests上传Excel工作表到Abstra平台出现NoSuchKey错误怎么解决

问题修复方案

1. 核心问题:内存流指针位置错误

你调用wb.save(virtuality)后,BytesIO对象的文件指针会停留在流的末尾,直接传入请求时读取到的内容为空,等于上传了空内容,因此存储端没有生成有效文件。修复方法是在save操作后重置指针到流的起始位置:

wb.save(virtuality)
virtuality.seek(0) # 新增这行重置指针

2. 预签名URL请求方法错误

绝大多数云存储生成的预签名上传URL要求使用PUT方法提交,而非你当前用的POST方法,需要修改第二个请求的调用方法。

3. 避免使用files参数上传

files参数会自动封装为multipart/form-data格式,而预签名上传URL通常要求直接把二进制文件内容放在请求体中,否则会被云存储判定为无效内容,直接传二进制流即可,不需要用files参数。

4. 补全缺失的导入声明

你的代码中缺少两个必要导入,否则会直接运行报错:

import json
from openpyxl.workbook.protection import WorkbookProtection

修复后完整代码

import io
import json
import requests
import openpyxl as opx
from openpyxl.workbook.protection import WorkbookProtection

def upload(xlsx, name):
    wb = opx.load_workbook(io.BytesIO(xlsx)) 
    virtuality = io.BytesIO()                
    wb.security = WorkbookProtection(workbookPassword = 'project-password', lockStructure = True)
    wb.save(virtuality) 
    # 重置流指针到起始位置
    virtuality.seek(0)
    name2 = name.replace(' ', '_')
    name2 = name2.replace("'", '_')
    data = {"name": name, 'filepath': "be6b94dd-6e22-4aaa-9b91-95f87bb543e4/"+name2}
    data = json.dumps(data)
    r = requests.post('https://abstra-uploads.herokuapp.com/file/upload', 
                          data = data,
                          headers = {"content-type": "application/json",})

    dictofjson = json.loads(r.text)
    # 改用PUT方法,直接传二进制内容
    r2 = requests.put(url = dictofjson["putURL"],
                      data = virtuality.read(),
                      headers = {"Content-Type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"})
    return dictofjson["getURL"]

内容的提问来源于stack exchange,提问作者N L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:24:07