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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:05:12