
本文档介绍了如何在 Heroku 平台上,利用 Python Flask 框架动态生成文件,并通过前端 JavaScript 代码提供下载链接。重点讲解了后端文件生成、数据传递以及前端 Blob 对象的使用,帮助开发者实现动态文件下载功能。由于 Heroku 的 Dyno 会在重启后清除文件系统,因此本文提供的方案主要适用于临时文件的生成和下载。
后端 Flask 代码实现
首先,我们需要创建一个 Flask 应用,并定义一个路由来处理文件生成和数据返回的请求。以下是一个示例:
from flask import Flask, request, json
app = Flask(__name__)
@app.route("/test", methods=['GET', 'POST'])
def test():
if request.method == "POST":
# 创建文件
f = open("myfile.txt", "w")
f.write("content")
f.close()
# 读取文件内容
f = open("myfile.txt", 'r')
file_content = f.read()
f.close()
# 返回 JSON 数据,包含文件内容
return json.dumps({'success': True, 'data': file_content}), 200, {'ContentType': 'application/json'}
if __name__ == '__main__':
app.run(debug=True)这段代码首先定义了一个 /test 路由,该路由只接受 POST 请求。当收到请求时,它会创建一个名为 myfile.txt 的文件,并写入 "content" 内容。然后,它读取该文件的内容,并将内容封装在 JSON 数据中返回给前端。
注意事项:
- 由于 Heroku 的文件系统是临时的,每次 Dyno 重启后都会被清除,因此不适合存储持久性数据。
- 在生产环境中,应该考虑使用云存储服务(如 AWS S3、Google Cloud Storage 等)来存储文件。
- 在读取文件后,务必使用 f.close() 关闭文件,释放资源。
前端 JavaScript 代码实现
接下来,我们需要使用 JavaScript 代码来发送 POST 请求到后端,并处理返回的数据,生成下载链接。以下是一个示例:
$.ajax('/test', {
type: 'POST',
data: { myData: product}, // 可选:发送一些数据到后端
dataType: 'json',
success: function(data, status, xhr) {
console.log('response');
console.log(data);
console.log(data['success']);
// 创建 Blob 对象
var blob=new Blob([data['data']], {type: "text/plain"});
// 创建下载链接
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="myfile.txt";
// 触发下载
link.click();
},
error: function (jqXhr, testStatus, errorMessage) {
console.log("error");
}
});这段代码使用 jQuery 的 $.ajax 函数发送一个 POST 请求到 /test 路由。在 success 回调函数中,它首先从返回的 JSON 数据中获取文件内容。然后,它使用 Blob 对象将文件内容转换为一个二进制对象,并指定 MIME 类型为 text/plain。接下来,它创建一个 元素,设置 href 属性为 Blob 对象的 URL,并设置 download 属性为文件名 myfile.txt。最后,它触发 元素的 click 事件,从而启动下载。
注意事项:
- 需要引入 jQuery 库。
- Blob 对象允许你在客户端创建类似于文件的对象,无需将文件上传到服务器。
- window.URL.createObjectURL 方法创建一个指向 Blob 对象的临时 URL。
- link.download 属性指定下载文件的名称。
总结
通过结合 Flask 后端和 JavaScript 前端,我们可以在 Heroku 平台上实现动态文件生成和下载的功能。这种方法适用于生成临时文件,并提供给用户下载。如果需要存储持久性数据,应该考虑使用云存储服务。此外,需要注意资源释放,以及处理错误情况。










