我使用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文件?
答案 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文件的本地文件的名称。要从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
之前,您不需要将其转换为<a target="_blank" href="https://calendar.google.com/calendar/event?action=TEMPLATE&tmeid=OWd1dTBzdWpxamh2b3F1b2drOW1tbDUycDQgcDRpdjdwb2NkZmVoMW5wbmh2ZnJtNDhudThAZw&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))