2016-10-10 4 views
0

Я отправляю байтовую строку zip-файла с клиентской стороны, используя 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 

Как сохранить мои байты строки в виде архив?

+0

Вы _sure_, что данные, возвращаемые с 'request.POST.get (" zipFile ")', являются zipfile? В частности, это первые 4 байта 'b'PK \ x03 \ x04''? Кроме того, вы должны указать, используете ли вы Python 2 или Python 3 (желательно с помощью соответствующего тега). –

+0

Я использовал 'zip.generateAsync ({type:" base64 "})' метод из 'JSZip', чтобы преобразовать загруженный файл в zip и получить байтовую строку. Должен доверять библиотеке, чтобы все исправить, не так ли? И я использую Python 3 –

+1

Вы, скорее всего, захотите декодировать это с помощью 'binascii.a2b_base64'. –

ответ

-1

Не пробовал, но вы можете использовать io.BytesIO построить буферизацию поток с байтами, а затем создать свой почтовый файл, как так:

import io 

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

он дает ошибку 'аргумент должен быть строкой, байтами или целым числом, а не _io.BytesIO' –

+0

@TahreemIqbal не могли бы вы рассказать мне, какой результат дает тип '(b)', потому что я предполагал, что это тип 'bytes', иначе он не будет работать – coder

2

JSZip уже сделал почтовый архив. Модуль 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) 
+0

с небольшой модификацией ('zipFile.write (bytes (zipContents, 'UTF-8'))), он создал zip-файл, но при открытии он дает ошибку, что файл поврежден. –

+0

Я сдаюсь. Вместо этого я просто сжимаю файл с клиентской стороны. Благодарю. –

+2

Что? Я думал, вы уже это сделали, почему бы вам не упомянуть JSZip? Кроме того, zip-файлы не являются текстовыми и не должны использовать кодировки символов, такие как UTF-8. Это двоичные данные. Из-за этого ваш объект 'request' может быть важным; вероятно, придется декодировать данные из base64, urlescape или аналогичных. –

2

ZipFile.write(filename, [arcname[, compress_type]]) принимает имя локального файла, который будет добавлен в почтовый файл. Для записи данных из 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 (или str в python2) вам не нужно, чтобы преобразовать его в bytearray перед тем записывая его в архив.