在和我意識到,也許我的問題不是100%清楚。無論如何,我想分享我提出的解決方案。我在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。
download.js作者:如果有人知道Safari瀏覽器修復,我會非常感激。也就是說,如果您使用服務器生成內容,則只需使用內容處置標頭即可在隱藏的iframe中觸發下載。 – dandavis
有一個很好的剪輯頂部,將告訴你如何下載表單響應或iframe位置更改:http://php.net/manual/en/function.header.php#refsect1-function.header-examples – dandavis