如何从字节数组创建zipFile

2024-10-03 15:23:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个字节数组——每个对象都是保存在内存中的文件(文本)。 我试着把它们压缩成zip文件并下载。 我得到一个错误“\u io.BytesIO”对象不可下标”。 代码如下:

@app.route('/home', methods =['GET','POST'])
def home():
    form = Form()
    if form.validate_on_submit():
       new_file = create_file(form, index)
       return send_file(new_file, attachment_filename=name, as_attachment=True) 
    return render_template('ot.html', title='new', form=form)

def create_file(form, index):
    pick_up_file = create_file_base(form, index, 'start.text')
    drop_tip_file = create_file_base(form, index, 'end.text')
    working_file = create_file_base(form, index, 'workFile.text')
    files = [working_file]
    memory_file = BytesIO()
    with zipfile.ZipFile(memory_file, 'w') as fileobj:
        for curFile in files:
            data = zipfile.ZipInfo(curFile['fileName'])
            data.date_time = time.localtime(time.time())[:6]
            data.compress_type = zipfile.ZIP_DEFLATED
            fileobj.writestr(data, curFile['fileData'])
    memory_file.seek(0)
    return memory_file

def create_file_base(form, index, name):
    myData = 'abc'
    new_file = BytesIO()
    new_file.write(myData.encode('utf-8'))
    src_file = open('otFile/static/'+name, 'r')
    src_text = src_file.read()
    src_file.close()
    new_file.write(src_text.encode('utf-8'))
    new_file.seek(0)
    return new_file

错误的完整回溯:

File "C:\Users\lirons\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 2464, in __call__
Open an interactive python shell in this framereturn self.wsgi_app(environ, start_response)
File "C:\Users\lirons\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\lirons\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\lirons\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "C:\Users\lirons\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\lirons\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\lirons\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\lirons\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "C:\Users\lirons\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\lirons\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\lirons\Documents\ot2\otFile\routes.py", line 35, in home
new_file = create_file(form, index)
File "C:\Users\lirons\Documents\ot2\otFile\routes.py", line 54, in create_file
data = zipfile.ZipInfo(curFile['fileName'])

Tags: inpyformappliblocallinesite
1条回答
网友
1楼 · 发布于 2024-10-03 15:23:10

我找到了解决办法。 更改为:

files = [working_file]
memory_file = BytesIO()
with zipfile.ZipFile(memory_file, 'w') as fileobj:
    for curFile in files:
        data = zipfile.ZipInfo(curFile['fileName'])
        data.date_time = time.localtime(time.time())[:6]
        data.compress_type = zipfile.ZIP_DEFLATED
        fileobj.writestr(data, curFile['fileData'])

致:

with zipfile.ZipFile(memory_file, 'w', compression=zipfile.ZIP_DEFLATED) as zipObject:
    zipObject.writestr("pick_up_file " , pick_up_file.read())
    zipObject.writestr("drop_tip_file" , drop_tip_file.read())
    zipObject.writestr("working_file" , working_file.read())

相关问题 更多 >