在实践中,我意识到我的问题可能没有百分之百的清晰。无论如何,我想分享我想出来的解决方案。我在Flask应用程序中创建了两个端点:
第一个通过AJAX POST从客户端获取数据,并将它们暂时存储在Redis中(我已经有一个用于缓存的Redis实例),并为文件生成UUID。
@mod.route("/create-csv", methods=['POST'])
def create_csv():
csv_string = request.form.get('csv')
file_id = str(uuid())
rstore.setex(file_id, 60, csv_string)
return jsonify({}), 202, {'Location': url_for('api.download',
file_id=file_id,
_external=True,
_scheme='https')}
第二个端点只是使用适当的标头将文件发送到客户端。
@mod.route("/download/<file_id>", methods=['GET'])
def download(file_id):
file_content = rstore.get(file_id)
response = make_response(file_content)
response.headers["Content-Disposition"] = "attachment; filename=keywords.csv"
response.headers['Content-Type'] = "application/octet-stream"
return response
在客户端网站上,我有以下JavaScript代码:
self.save = function(csvdata) {
$.post( "/api/create-csv", csvdata, function(data, status, response){
var file_url = response.getResponseHeader('Location');
window.location.assign(file_url);
});
}
当POST请求成功发送时,我只需将当前URL分配给文件下载的URL。