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

