当前位置: 首页 > 面试题库 >

如何在python Flask框架中发送zip文件?

单勇
2023-03-14
问题内容

我有一个Flask服务器,它从数据库中获取几个不同文件的二进制数据,并将它们放入python’zipfile’对象中。我想使用flask的“
send_file”方法将生成的zip文件与我的代码一起发送。

我最初能够通过使用BytesIO(bin)作为send_file的第一个参数来成功发送非zip文件,但是由于某些原因,我无法对生成的zip文件执行相同的操作。它给出了错误:

‘ZipFile’没有缓冲区接口。

如何使用Flask将此zip文件对象发送给用户?

这是我的代码:

@app.route("/getcaps",methods=['GET','POST'])
def downloadFiles():
    if request.method == 'POST':
        mongo = MongoDAO('localhost',27017)
        identifier = request.form['CapsuleName']
        password = request.form['CapsulePassword']
        result = mongo.getCapsuleByIdentifier(identifier,password)
        zf = zipfile.ZipFile('capsule.zip','w')
        files = result['files']
        for individualFile in files:
            data = zipfile.ZipInfo(individualFile['fileName'])
            data.date_time = time.localtime(time.time())[:6]
            data.compress_type = zipfile.ZIP_DEFLATED
            zf.writestr(data,individualFile['fileData'])
        return send_file(BytesIO(zf), attachment_filename='capsule.zip', as_attachment=True)
    return render_template('download.html')

问题答案:

BytesIO()需要传递 字节数据 ,但ZipFile()对象不是字节数据;您实际上在 硬盘上 创建了一个文件。

您可以ZipFile()使用BytesIO() 作为基础 在内存中创建一个:

memory_file = BytesIO()
with zipfile.ZipFile(memory_file, 'w') as zf:
    files = result['files']
    for individualFile in files:
        data = zipfile.ZipInfo(individualFile['fileName'])
        data.date_time = time.localtime(time.time())[:6]
        data.compress_type = zipfile.ZIP_DEFLATED
        zf.writestr(data, individualFile['fileData'])
memory_file.seek(0)
return send_file(memory_file, attachment_filename='capsule.zip', as_attachment=True)

with语句确保在ZipFile()完成添加条目后,该对象已正确关闭,从而使该对象将所需的尾部写入内存文件对象。该memory_file.seek(0)电话是需要“倒带”文件对象回到开始的读写位置。



 类似资料:
  • 我想将带有JSON对象的POST请求发送到指定的URL,但总是失败。 我已经检查了每个数据,以确保它们是正确的,但当我发送它们时,它们似乎被更改了,因此目标服务器无法正确处理我的请求。 我想这可能是appid中的错误。回复总是告诉我appid不正确,即使我百分之百确定它是正确的。下面是appid参数的格式:name:appid type:INT,但17位数字的INT完全超出范围。 响应:{“err

  • 问题内容: 我想知道如何将zip文件发送到WebApi控制器,反之亦然。问题是我的WebApi使用json传输数据。一个zip文件不可序列化,或者是流。字符串将可序列化。但是除了将zip转换为字符串并发送字符串之外,还必须有其他解决方案。这听起来是错误的。 任何想法如何做到这一点? 问题答案: 如果您的API方法期望使用,则可以从中提取流: 当使用张贴HTTP表单时,这对我有用。

  • 我试图弄清楚如何从给定的文件夹路径创建新的zip文件,并将其发送回发件人。 需要的是,该文件将在请求它的发件人处下载。我已经看到了很多答案,但没有一个能帮我找到准确的答案。 我的代码: Guid folderGuid=Guid。NewGuid();string folderToZip=ConfigurationManager。AppSettings[“folderToZip”]folderGuid

  • 我很难让我的机器人发送Twilio消息。我一直收到400个错误的请求,我在这里把msg对象看作JSON——我想我为Twilio创建地址的方式有问题吧?我也已经通过并在管理工具中设置了Twilio频道 SMS=={“数据”:{“类型”:“消息”,“代理”:“botbuilder”,“文本”:“测试消息”,“地址”:{“频道id”:“SMS”,“对话”:{“id”:“4I4HLAND06HA5G3”,

  • 让我们举一个电子邮件传奇的例子:当一个用户注册时,我们创建一个发布UserRegisterEvent的用户聚合,一个传奇将被创建,这个传奇负责确保注册电子邮件被发送给用户(电子邮件可能包含验证密钥、欢迎消息等)。 我们是否应该使用: > 用try/catch->缩放吗? 使用deadline是因为我们只使用“send”,而不处理命令的最终错误,这可能是发送失败(其他服务关闭,等等) 其它的呢? 还

  • 我试图在ZIP文件内创建一个ZIP文件,以重新构建以前在内存中的zip结构,我在Java。 我失败了,因为我得到了一个错误的内部ZIP内创建的初始ZIP文件。文件已损坏。当试图打开它时,我得到一个“文件的意外结局”。 我得到了这个结构: -input.zip--InnerInput.zip 代码使用java Stack和Map在内存中解压。然后它创建input2.zip,内部nput.zip。 总