使用tempfile.TemporaryFile迁移S3 Bucket全版本内容时上传文件为空的问题
解决S3跨桶迁移(含版本)时临时文件上传为空的问题
嘿,我一眼就看出问题出在哪啦!你遇到的0字节文件问题,核心原因是临时文件的指针位置不对。
当你用sourceUser.download_fileobj把内容写入临时文件后,文件指针会停在内容的末尾位置。这时候如果直接调用上传方法,程序会从这个末尾位置开始读取——自然读不到任何内容,上传的文件就变成空的了。你之前检查内容时调用了data.seek(0)把指针移回开头,所以能打印出正确内容,但检查完之后指针又回到了末尾,上传前没再移回去对吧?
给你修正后的完整代码,重点就是在上传前重新把指针移到文件开头:
import tempfile # 假设sourceUser是源S3客户端,destUser是目标S3客户端 with tempfile.TemporaryFile() as data: # 从源桶下载指定版本的内容(如果需要处理版本,加上VersionId参数) sourceUser.download_fileobj( 'source-bucket', key, data, # 可选:如果要迁移特定版本,取消下面注释并替换版本ID # ExtraArgs={'VersionId': 'your-version-id-here'} ) # 关键!将文件指针重置到起始位置,确保上传时能读取全部内容 data.seek(0) # 上传到目标桶 destUser.upload_fileobj(data, 'dest-bucket', key) # 如果后续还要验证内容,再次seek(0)后读取 data.seek(0) print(data.read()) # 依然能看到正确的文件内容
另外再给你两个小提示:
tempfile.TemporaryFile默认以w+b模式打开,完美适配S3的二进制文件传输,不用额外指定模式- 如果要迁移存储桶的所有版本,你需要先调用
list_object_versions获取源桶的所有版本记录,然后循环处理每个版本的文件,确保每个版本都被迁移过去
内容的提问来源于stack exchange,提问作者Claudiu
相关产品推荐
相关产品推荐

