Http 下载文件以响应POST请求?
我正在尝试创建一个API端点,它接受多个文件(这就是为什么我需要POST请求,而不是GET请求),并用另一个文件响应。我希望浏览器显示一个“另存为…”对话框(或只是开始下载) 下面是一个不起作用的演示代码(Flask): 我可以看到正确的响应标题,但在浏览器中什么也没有发生:Http 下载文件以响应POST请求?,http,flask,content-disposition,Http,Flask,Content Disposition,我正在尝试创建一个API端点,它接受多个文件(这就是为什么我需要POST请求,而不是GET请求),并用另一个文件响应。我希望浏览器显示一个“另存为…”对话框(或只是开始下载) 下面是一个不起作用的演示代码(Flask): 我可以看到正确的响应标题,但在浏览器中什么也没有发生: HTTP/1.0 200 OK Content-Disposition: attachment; filename=sample.txt Content-Length: 612 Content-Type: text/pla
HTTP/1.0 200 OK
Content-Disposition: attachment; filename=sample.txt
Content-Length: 612
Content-Type: text/plain; charset=utf-8
如果我从端点删除methods=['POST']
,并向其发出GET请求,它工作正常,浏览器会询问我是否要保存此文件
我做错了什么,或者事情是这样的(帖子回复忽略了内容配置?似乎浏览器显示了下载弹出窗口,仅针对
GET
请求。但有一种方法可以从客户端显示它。大概是这样的:
document.getElementById('download').addEventListener('click', function () {
var content = document.getElementById('content').value;
var request = new XMLHttpRequest();
request.open('POST', '/api', true);
request.setRequestHeader('Content-Type', 'text/plain; charset=UTF-8');
request.responseType = 'blob';
request.onload = function() {
if(request.status === 200) {
var filename = 'sample.txt';
// The actual download
var blob = new Blob([request.response], { type: 'text/plain' });
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
// some error handling should be done here...
};
request.send('content=' + content);
});
中的更多详细信息我猜浏览器默认情况下只从
GET
请求下载文件。您需要在客户端修复它。例如,如果看到或您的解决方案有效,请将其作为答案发布)这似乎仍然是一种黑客行为(不确定浏览器行为是否针对这种情况进行了标准化,因此很难找到干净的解决方案)
document.getElementById('download').addEventListener('click', function () {
var content = document.getElementById('content').value;
var request = new XMLHttpRequest();
request.open('POST', '/api', true);
request.setRequestHeader('Content-Type', 'text/plain; charset=UTF-8');
request.responseType = 'blob';
request.onload = function() {
if(request.status === 200) {
var filename = 'sample.txt';
// The actual download
var blob = new Blob([request.response], { type: 'text/plain' });
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
// some error handling should be done here...
};
request.send('content=' + content);
});