从byte创建zip文件

时间:2016-10-10 11:51:30

标签: python python-3.x zipfile

我使用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文件?

3 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:3)

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之前,您不需要将其转换为<a target="_blank" href="https://calendar.google.com/calendar/event?action=TEMPLATE&amp;tmeid=OWd1dTBzdWpxamh2b3F1b2drOW1tbDUycDQgcDRpdjdwb2NkZmVoMW5wbmh2ZnJtNDhudThAZw&amp;tmsrc=p4iv7pocdfeh1npnhvfrm48nu8%40group.calendar.google.com"><img border="0" src="https://www.google.com/calendar/images/ext/gc_button1_en.gif"></a> 档案

答案 2 :(得分:-1)

没有尝试过,但您可以使用io.BytesIO构建缓冲流 用你的字节,然后像这样创建你的zip文件:

import io

with ZipFile('my_file.zip', 'w') as myzip:
    myzip.write(io.BytesIO(b))