zoukankan      html  css  js  c++  java
  • flask上传下载文件(一)下载

    简介:

    作为一个可以和用户交互的web应用,必然要有数据导出功能,导出到excel是比较常用的方式。

    flask有一个扩展叫flask-excel,可能不适合中国人用,因为没有看到修改列名的功能。也许以后会好点。内部原理也不清楚。

    在查资料的时候发现了一个有趣的东西,叫流式,原博客地址为:https://www.cnblogs.com/Erick-L/p/7015783.html

    大概的意思就是说,如果是有大量数据的传输,最好用流的方式,虽然也不怎么懂。

    但是测试了两种方法以后,发现流式传输确实比较好用。

    一:文件格式

    学艺不精,暂时只明白了csv和xls(xlsx)这两个格式。

    1.csv

    CSV是文本文件,用记事本就能打开。是以逗号(,)分割列的一种存储方式。
    CSV 文件格式只能保存活动工作表中的单元格所显示的文本和数值。下次打开,公式就没了。

    2.xls(xlsx)

    XLS 是二进制的文件只有用 EXCEL(WPS) 或者其他的office办公软件才能打开。
    XLS 中所有的数据行和字符都将保存。可以保存公式,格式,引用………一些东西。

    二:传统方法

    1.send_file

    这种方法就是指定一个文件名,一堆参数告诉浏览器,这是下载文件,不是浏览网页。

    def send_file(filename_or_fp, mimetype=None, as_attachment=False,
                  attachment_filename=None, add_etags=True,
                  cache_timeout=None, conditional=False, last_modified=None):

    2.send_from_directory

    这个方法貌似好一点了,似乎不用自己配置一堆参数了。可惜,这是骗你的,return send_file(filename, **options),请参照send_file自己写参数,或者不写。

    def send_from_directory(directory, filename, **options):

    3.总结

    这两种方法貌似适合硬盘上已经存在的文件。

    我们要实现的是动态查询结果,生成excel供客户下载。

    似乎不是太好用。

    笨办法就是自己去生成excel文件,供客户下载,下载完了再删除,这个貌似也没反馈信息。还要自己写文件管理的功能,删除超过几天的文件?

    4.tempfile

    这个模块说是创建临时文件,自动管理的,或许配合自己生成文件,也可以。

    三:临时文件写到内存里

    1.StringIO

    流式处理接口

    2.避免创建文件

    http://flask.pocoo.org/snippets/32/

    这个貌似解决了

    3.示例代码

    #!/usr/bin/env python
    
    # Thanks to Dan Jacob for a part of the code !
    
    from flask import Flask, send_file
    import StringIO
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        strIO = StringIO.StringIO()
        strIO.write('Hello from Dan Jacob and Stephane Wirtel !')
        strIO.seek(0)
        return send_file(strIO,
                         attachment_filename="testing.txt",
                         as_attachment=True)
            
    app.run(debug=True)
    View Code
    import numpy as np
    import pandas as pd
    from io import BytesIO
    from flask import Flask, send_file
    
    app = Flask(__name__)
    @app.route('/')
    
    def index():
    
        #create a random Pandas dataframe
        df_1 = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD'))
    
        #create an output stream
        output = BytesIO()
        writer = pd.ExcelWriter(output, engine='xlsxwriter')
    
        #taken from the original question
        df_1.to_excel(writer, startrow = 0, merge_cells = False, sheet_name = "Sheet_1")
        workbook = writer.book
        worksheet = writer.sheets["Sheet_1"]
        format = workbook.add_format()
        format.set_bg_color('#eeeeee')
        worksheet.set_column(0,9,28)
    
        #the writer has done its job
        writer.close()
    
        #go back to the beginning of the stream
        output.seek(0)
    
        #finally return the file
        return send_file(output, attachment_filename="testing.xlsx", as_attachment=True)
    
    app.run(debug=True)
    View Code

    这似乎解决了我们生成文件,还需要管理文件的困扰。

     四:大小和速度

    1.速度

    测试了几段代码的响应速度,send_file是比较适合发送已经存在于硬盘上的文件。动态生成的文件,需要等文件生成,客户端才会有下载文件的提示。

    如果文件比较大的话,点击下载后,还要几十秒才能开始下载,即使生成的文件放到内存也不快。

    2.响应流

    Flask响应流的实现原理就是通过Python的生成器,也就是大家所熟知的yield的表达式,将yield的内容直接发送到客户端。

    3.示例代码

    @app.route('/large.csv')
    def generate_large_csv():
        def generate():
            for row in range(50000):
                line = []
                for col in range(500):
                    line.append(str(col))
     
                if row % 1000 == 0:
                    print 'row: %d' % row
                yield ','.join(line) + '
    '
     
        return Response(generate(), mimetype='text/csv')

    这段代码是生成csv格式的文件下载,总大小大概是90M左右。

    优点是随点随开始下载,后台继续生成新的文件内容。

    如果用传统方法,要等整个90M文件生成完毕,才会开始下载。内存模式的代码没测试。

    4.优点:

    处理大量数据时,响应速度快。

    5.缺点:

    暂时我只看示例代码,会处理csv文件,excel文件还不会。

     

  • 相关阅读:
    Server Application Unavailable 解决办法 (转)
    SQL SERVER:分割函数 split
    Win32汇编_基础
    Win32汇编_异常_筛选器
    创建进程常用函数
    内存常用函数
    桃花庵歌
    文天祥的诗
    Socket I/O模型全接触
    函数指针的神奇
  • 原文地址:https://www.cnblogs.com/jackadam/p/9535139.html
Copyright © 2011-2022 走看看