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

使用Python从PostgreSQL的bytea字段读取压缩包得到无效归档问题求助

问题排查与解决步骤

  • 第一步:先确认存储的源数据合法性
    存入压缩包前,先将待写入数据库的二进制流落地为本地zip文件,测试是否可正常解压。同时在PostgreSQL中执行如下命令查询该字段的字节长度,和原压缩包文件大小做对比:

    SELECT octet_length(ansiblezip) FROM library WHERE id = 对应记录ID;
    

    如果长度不一致,说明写入数据库的逻辑就存在数据丢失/损坏问题,优先排查写入流程。

  • 第二步:修复SQL查询逻辑的安全与正确性问题
    你当前使用的字符串拼接SQL方式存在SQL注入风险,且如果projectId包含特殊字符会导致SQL执行异常,甚至查询到错误数据,必须改为参数化查询:

    def getAnsibleByLibrary(projectId):
        con = psycopg2.connect(
            database="xyz",
            user="user",
            password="pwd",
            host="localhost",
            port="5432",
        )
        print("Database opened successfully")
        cur = con.cursor()
        # 改用参数化查询,不要手动拼接SQL
        query = "SELECT ansiblezip FROM library WHERE library.id = (SELECT libraryid from project WHERE project.id = %s)"
        cur.execute(query, (projectId,))
        rows = cur.fetchall()
        repository = rows[0][0]
        con.close()
        # 先检查zip文件头是否正确,正常zip开头十六进制为504b0304
        print("文件头十六进制:", repository.hex()[:8])
        # 转成bytes再写入,避免环境适配问题
        with open("zippedOne.zip", "wb") as f:
            f.write(bytes(repository))
    
  • 第三步:验证读取内容的格式
    执行上述代码后查看打印的文件头:

    • 如果不是504b0304,说明你存入bytea字段的内容不是原生zip二进制,大概率是写入前做了base64编码或者其他转码操作,读取后需要做对应的解码操作才能得到正确的压缩包内容。
    • 如果文件头正确,比对生成的zippedOne.zip大小和数据库中查询的octet_length数值,二者一致的情况下压缩包必然可正常解压,如果还是报错可尝试更换解压工具验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:09:04