从字节创建 zip 文件

Posted

技术标签:

【中文标题】从字节创建 zip 文件【英文标题】:Creating zip file from byte 【发布时间】:2016-10-10 11:51:29 【问题描述】:

我正在使用JSZip 从客户端发送 zip 文件的字节字符串,并且需要在服务器端将其转换回 zip。我试过的代码不起作用。

b = bytearray()
b.extend(map(ord, request.POST.get("zipFile")))

zipPath = 'uploadFile' + str(uuid.uuid4()) + '.zip'
myzip = zipfile.ZipFile(zipPath, 'w') 
with  myzip:
    myzip.write(b)

它给出了错误:

stat: path too long for Windows 

如何将我的字节字符串保存为 zip 文件?

【问题讨论】:

确定request.POST.get("zipFile") 返回的数据是一个压缩文件吗?特别是前 4 个字节是b'PK\x03\x04'?此外,您应该提及您使用的是 Python 2 还是 Python 3(最好使用适当的标签)。 我使用JSZip中的zip.generateAsync(type:"base64")方法将上传的文件转换为zip并获取字节字符串。必须相信图书馆会做对,对吧?我正在使用 Python 3 您可能希望使用binascii.a2b_base64 对其进行解码。 【参考方案1】:

ZipFile.write(filename, [arcname[, compress_type]]) 采用要添加到 zip 文件的本地文件的名称。要从bytearraybytes 对象写入数据,您需要改用ZipFile.writestr(zinfo_or_arcname, bytes[, compress_type]) 方法:

with zipfile.ZipFile(zipPath, 'w'):
    zipFile.write('name_of_file_in_archive', zipContents)

注意:如果request.POST.get("zipFile") 已经是bytes(或python2 中的str),则无需在将其写入存档之前将其转换为bytearray

【讨论】:

【参考方案2】:

JSZip 已经制作了一个 zip 存档。 zipfile 模块用于访问 zip 文件内容,但您不需要解析它来存储它。此外,bytearray 可以直接从字符串创建,因此 map(ord,) 是多余的,并且 write 也可以处理字符串(bytearray 用于处理数字二进制数据或制作可变字符串对象)。所以稍微简化的变体可能是:

zipContents = request.POST.get("zipFile")
zipPath = 'uploadFile' + str(uuid.uuid4()) + '.zip'
with open(zipPath, 'wb') as zipFile:
    zipFile.write(zipContents)

【讨论】:

稍作修改 (` zipFile.write(bytes(zipContents, 'UTF-8')) `) 它创建了 zip 文件但打开它会给出文件损坏的错误。 > 我放弃了。我只会从客户端压缩文件。谢谢。 什么?我以为你已经做到了,否则你为什么要提到 JSZip?此外,zip 文件不是文本,不应使用 UTF-8 等字符编码。它们是二进制数据。因此,您的 request 对象可能很重要;它可能必须解码来自 base64、urlescape 或类似的数据。

以上是关于从字节创建 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

解压缩文件将文件转换为字节

React - 从字节字符串中的 API 响应正文下载 Zip 文件?

将字节数组中的文件写入 zip 文件

在内存中写入具有给定字节数组的ZipEntry

PHP:使用 ZipArchive 创建 zip 文件时出现错误 (500)

从文件夹中的所有文件创建 zip 文件