Python Flask send_file StringIO blank files

前端 未结 3 1655
無奈伤痛
無奈伤痛 2020-12-13 18:42

I\'m using python 3.5 and flask 0.10.1 and liking it, but having a bit of trouble with send_file. I ultimately want to process a pandas dataframe (from Form data, which is u

相关标签:
3条回答
  • 2020-12-13 18:56

    if someone use python 2.7 with Flask and got the error about the module StringIO by importing it. This post can help you to solve your problem.

    If you are importing String IO module, you can just change the import syntax by using this : from io import StringIO instead from StringIO import StringIO.

    You can Also use from io import BytesIO if you are using image or some others ressource.

    Thank you

    0 讨论(0)
  • 2020-12-13 18:57

    The issue here is that in Python 3 you need to use StringIO with csv.write and send_file requires BytesIO, so you have to do both.

    @app.route('/test_download')
    def test_download():
        row = ['hello', 'world']
        proxy = io.StringIO()
    
        writer = csv.writer(proxy)
        writer.writerow(row)
    
        # Creating the byteIO object from the StringIO Object
        mem = io.BytesIO()
        mem.write(proxy.getvalue().encode('utf-8'))
        # seeking was necessary. Python 3.5.2, Flask 0.12.2
        mem.seek(0)
        proxy.close()
    
        return send_file(
            mem,
            as_attachment=True,
            attachment_filename='test.csv',
            mimetype='text/csv'
        )
    
    0 讨论(0)
  • 2020-12-13 19:08

    I guess you should write bytes.

    from io import BytesIO    
    
    from flask import Flask, send_file
    
    
    app = Flask(__name__)
    
    
    @app.route('/test_download', methods=['POST'])
    def test_download():
        # Use BytesIO instead of StringIO here.
        buffer = BytesIO()
        buffer.write(b'jJust some letters.')
        # Or you can encode it to bytes.
        # buffer.write('Just some letters.'.encode('utf-8'))
        buffer.seek(0)
        return send_file(buffer, as_attachment=True,
                         attachment_filename='a_file.txt',
                         mimetype='text/csv')
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    0 讨论(0)
提交回复
热议问题