在服务器上创建的普通 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 做出反应)