在服务器上创建的普通 zip 文件,在客户端收到损坏的 zip 文件

Posted

技术标签:

【中文标题】在服务器上创建的普通 zip 文件,在客户端收到损坏的 zip 文件【英文标题】:Normal zip file created on server, corrupted zip file received in client 【发布时间】:2018-01-25 16:48:31 【问题描述】:

我有一个 Vue.js 应用程序正在尝试从 Flask 服务器请求一个 zip 文件。但是,当我从服务器接收到有效负载并尝试打开它时,我正在使用的包 (JSZip) 告诉我 zip 文件已损坏。如果我通过浏览器请求 url,则 zip 文件下载没有问题。我认为这可能是生成 zip 文件的方式,但我不确定。为什么文件会在客户端损坏?

客户端javascript代码:

const jszip = require('./jszip.min.js');
...more code...

this.filesystem.REST.get('http://localhost:3000').then(function(result)
    var zip = new jszip();
    zip.loadAsync(result.data).then(function(contents) 
         // Execution does not reach this point
         // Fails with corruption error before the then() call
    )

)

服务器 Python 代码:

@app.route('/')
def home():
    playerFp = os.path.join(seriesMap[seriesid], playerid)
    fileList = os.listdir(playerFp)
    bytesIo = io.BytesIO()
    zf = zipfile.ZipFile(bytesIo, mode="w")
    for file in fileList:
        if '.jpg' in file or '.xml' in file:
            absFp =os.path.join(playerFp, file)
            if '.xml' in file:
                stats = getJsonFormat(absFp)
                jsonfile = file.replace('.xml', '.json')
                zf.writestr(jsonfile, stats)
            else:
                zf.write(absFp, os.path.relpath(absFp, playerFp))
    zf.close()  


    bytesIo.seek(0)

    return send_file(bytesIo,  attachment_filename=playerid+'.zip', as_attachment=False)

这是我在控制台中遇到的错误:

【问题讨论】:

您的服务器可能无法发送 blob。 http 请求可能正在降级某些字符编码。 看答案@rafafan2010 编码支持 async("string") 方法使用 UTF-8 对内容进行解码。如果您有不同编码的文本,您可以使用 async("uint8array") 获取字节数组,并使用您身边的 lib(iconv、iconv-lite 等)对其进行解码。要使用非 UTF-8 编码保存文本,请执行相同操作:在将其添加到 JSZip 之前将其编码为 Uint8Array。 你试过一个空拉链吗?还是不行吗? 【参考方案1】:

您在客户端上的脚本有问题。你需要定义你的 zip 文件:

var zip = new JSZip()

相对于:

var zip = new jszip()

【讨论】:

我实际上在文件开头有const jszip = require('./jszip.min.js');。应该包括那个。对不起。 我收到了jszip.JSZip is not a constructor。 JSZip 对象正在正确创建。它的读取不起作用。 @rafafan2010 查看您帖子中突出显示的语法。 jszip 未突出显示。而 JSZip 是。 @rafafan2010 除非您自己编写,否则永远不要使用缩小代码。

以上是关于在服务器上创建的普通 zip 文件,在客户端收到损坏的 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

Spring REST - 创建 .zip 文件并将其发送到客户端

如何从服务器端下载 zip 文件到客户端(django 做出反应)

创建文本文件并添加到zip文件并下载spring boot而不保存在本地服务器中

从字节创建 zip 文件

在内存中压缩多个目录和文件,而不在磁盘上存储 zip

JBoss5:由于 java.util.zip.ZipException 无法部署:打开 zip 文件时出错