Http 下载文件以响应POST请求?

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

我正在尝试创建一个API端点,它接受多个文件(这就是为什么我需要POST请求,而不是GET请求),并用另一个文件响应。我希望浏览器显示一个“另存为…”对话框(或只是开始下载)

下面是一个不起作用的演示代码(Flask):

我可以看到正确的响应标题,但在浏览器中什么也没有发生:

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);
});