使用Python向Supabase存储桶上传Zip文件异常:文件大小不符
问题原因与修复方案
核心问题
你的代码里zip_dir函数返回的file_path是最后一个被压缩的单个文件的路径,并非你生成的完整Zip文件路径。随后upload_zip函数打开并上传的是这个小文件,而非40KB+的Zip包,这就导致存储桶里的文件只有几百字节。
看zip_dir函数的逻辑:循环遍历目录文件时,file_path被反复赋值为单个文件的路径,最后返回的file_path是遍历到的最后一个文件,不是你创建的zip_filename对应的Zip文件。
修复步骤
1. 修正zip_dir的返回值
把返回的file_path替换为生成的Zip文件路径:
def zip_dir(version): """Zip a directory""" print(version) zip_filename = f"bondz_client-v{version["major_version"]}_{version["minor_version"]}_{version["patch_version"]}.zip" print(f"Zipping {zip_filename}") try: with zipfile.ZipFile(zip_filename, "w", zipfile.ZIP_DEFLATED) as zipf: for root, _, files in os.walk(local_dir): for file in files: file_path = os.path.join(root, file) arcname = os.path.relpath(file_path, local_dir) zipf.write(file_path, arcname) print("File zipped successfully.") # 返回Zip文件的路径,而非单个文件路径 return zip_filename, zip_filename except Exception as e: print(f"Error zipping files: {e}")
如果脚本运行目录和Zip生成目录不一致,建议用绝对路径确保正确性:
zip_file_path = os.path.abspath(zip_filename) return zip_file_path, zip_filename
2. 验证Zip文件生成(可选)
可以在zip_dir里添加打印,确认生成的Zip文件大小符合预期:
print(f"Generated Zip size: {os.path.getsize(zip_filename)} bytes")
3. 优化update_root_version函数(可选)
当前函数依赖全局变量update_type,改成参数传递更健壮:
def update_root_version(new_version, update_type): try: data, count = supabase.table('devices').update({update_type : new_version[update_type]}).eq('device_name', 'root').execute() print("Db updated successfully.") except Exception as e: print(f"Error updating db: {e},{data},{count}")
调用时传入参数:
update_root_version(new_version, update_type)
4. 清理本地临时Zip文件(可选)
上传完成后删除本地生成的Zip文件,避免冗余文件:
def upload_zip(file_path,filename): try: with open(file_path, 'rb') as f: supabase.storage.from_(BUCKET_NAME).upload(file=f,path=filename, file_options={"content-type": "application/zip", "upsert": "true"}) print(f"File {filename} uploaded successfully.") # 删除本地Zip文件 os.remove(file_path) print(f"Local Zip file removed: {file_path}") except Exception as e: print(f"Error uploading: {e}")
内容的提问来源于stack exchange,提问作者16ar
相关产品推荐
相关产品推荐

