从字节创建 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 文件的本地文件的名称。要从bytearray
或bytes
对象写入数据,您需要改用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 文件?