将字节创建成zip文件

3

我正在使用 JSZip 在客户端发送一个压缩文件的字节字符串,需要在服务器端将其转换回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") 返回的数据是一个zip文件吗?特别地,前4个字节是 b'PK\x03\x04' 吗?另外,你应该说明你正在使用Python 2还是Python 3(最好使用适当的标签)。 - PM 2Ring
我使用了JSZip中的zip.generateAsync({type:"base64"})方法将上传的文件转换为zip并获取字节字符串。必须相信库能够正确处理它,对吧?而且我正在使用Python 3。 - Tahreem Iqbal
1
你可能想使用 binascii.a2b_base64 进行解码。 - Yann Vernier
2个回答

11

ZipFile.write(filename, [arcname[, compress_type]])方法用于向压缩文件中添加本地文件的名称。如果要写入bytearraybytes对象中的数据,需要使用下面所示的ZipFile.writestr(zinfo_or_arcname, bytes[, compress_type])方法:

with zipfile.ZipFile(zipPath, 'w'):
    zipFile.writestr('name_of_file_in_archive', zipContents)
注意:如果request.POST.get("zipFile")已经是bytes类型(在Python2中为str),则在将其写入压缩文件之前不需要将其转换为bytearray

3

JSZip已经创建了一个zip存档文件。zipfile模块用于访问zip文件内容,但您不需要解析它来存储它。此外,字节数组可以直接从字符串创建,因此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'))),它成功创建了压缩文件,但打开时却提示文件已损坏。 - Tahreem Iqbal
我放弃了。我将在客户端压缩文件。谢谢。 - Tahreem Iqbal
2
什么?我以为你已经做过了,否则你为什么会提到JSZip呢?而且,压缩文件不是文本,不应该使用像UTF-8这样的字符编码。它们是二进制数据。你的 request 对象可能很重要,因为它可能需要对数据进行base64解码、url编码或类似操作。 - Yann Vernier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接