Flask如何不保存文件直接返回Selenium生成的Base64编码PDF
Flask直接返回Selenium生成的PDF(无需存文件)
直接按以下步骤实现即可:
解码Base64字符串
你拿到的pdf_string['data']是Base64编码的字符串,先把它解码成字节数据。注意有些CDP返回的字符串会带data:application/pdf;base64,前缀,需要先去掉再解码。用BytesIO包装字节数据
BytesIO可以把字节数据模拟成文件对象,完全在内存中操作,不用写入磁盘。用send_file返回响应
把BytesIO对象传给send_file,设置正确的mimetype和可选的下载参数。
完整代码示例
from flask import Flask, send_file import base64 from io import BytesIO app = Flask(__name__) @app.route('/get-pdf') def get_pdf(): # 替换成你从Selenium CDP获取到的Base64字符串 pdf_base64_str = pdf_string['data'] # 处理可能的前缀 if pdf_base64_str.startswith('data:application/pdf;base64,'): pdf_base64_str = pdf_base64_str.split(',')[1] # 解码为字节 pdf_bytes = base64.b64decode(pdf_base64_str) # 包装成BytesIO对象,必须重置指针到开头 pdf_io = BytesIO(pdf_bytes) pdf_io.seek(0) # 返回PDF:as_attachment设为True会触发下载,False则在浏览器直接打开 return send_file( pdf_io, mimetype='application/pdf', as_attachment=False, download_name='output.pdf' ) if __name__ == '__main__': app.run(debug=True)
关键注意点
- 必须调用
seek(0):BytesIO写入字节后,文件指针会停在末尾,send_file读取时需要从开头开始,所以一定要重置指针。 - mimetype只用
application/pdf:不需要加;base64后缀,因为我们已经把Base64解码成二进制数据流了,直接返回二进制即可。 - as_attachment参数:根据需求设置,True是让用户下载,False是在浏览器预览。
内容的提问来源于stack exchange,提问作者Alan Dsilva
相关产品推荐
相关产品推荐

