XMLHttpRequest()和输出csv文件

4

我可以通过发出HTML表单POST请求到新窗口并使用PHP响应来成功生成CSV文件:

header('Content-type: text/csv');
header('Content-Disposition: attachment; filename="'.date("Ymdhis").'.csv"');
print get_lines();

然而,这会使窗口保持打开且空白。
我希望自动关闭窗口(在Content-Disposition识别时)或者忽略窗口并简单地通过onClick调用XMLHttpRequest()将表单变量发送到PHP,生成数据文件,然后提示用户保存或打开。
我尝试过:
var xhReq = new XMLHttpRequest();
var parameters = "";

for ( i=0; i<formObj.elements.length; i++ ) {
  parameters += formObj.elements[i].name + "=" + encodeURI( formObj.elements[i].value ) + "&";
}

xhReq.open("POST", outputLocation, false);
xhReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhReq.setRequestHeader("Content-length", parameters.length);
xhReq.setRequestHeader("Connection", "close");
xhReq.send(parameters);

document.write(xhReq.responseText);

但是这样做行不通,因为响应只会作为文本显示在屏幕上。我真正想要的是,在获取所有数据后,发出一个新的header()调用而不打开新窗口 - 这是否可能使用JavaScript实现?
1个回答

3
你需要在新窗口中发送 POST 请求才能完成此操作。我建议你创建一个隐藏的表单,并将它的 target 属性设置为 _blank
你应该在服务器端设置 Content-disposition HTTP 头以强制下载。
你正在调用 document.write,这会将文本字符串转储到浏览器中,这可能不是你想要做的事情。

+1 - 再次强调 - 在这种情况下不建议使用XMLHttpRequest。一个简单的隐藏或动态生成的表单提交到“_blank”是合适的。 - Sky Sanders
看起来你已经在使用表单了 - 你可能不需要创建一个新的隐藏表单,只需将 target="_blank" 添加到当前表单中,并且弃用 javascript/XHR。此外,如果要使文件开始下载,请确保包含正确的标题。在 PHP 中:header("Content-Disposition: attachment; filename=someFileName.csv"); - Keith
我已经在使用一个新窗口 - 我试图避免这种情况,因为它并不是真正所需的...也许问题应该稍微重新表述一下 - 我该如何做到这一点,并在窗口意识到它具有Content-Disposition: attachment; filename=file.csv时自动关闭? - sjw
我将返回: header('Content-type: text/csv'); header('Content-Disposition: attachment; filename=file.csv"'); print $contents; 到xhReq.responseText; - sjw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接