【发布时间】:2019-02-16 09:15:44
【问题描述】:
我有一个关于在客户端应用程序上处理 gzip 响应的问题。我希望客户端的浏览器弹出一个警报“你想如何处理?”下载提示。
我的 Node.js 服务器正在将我的文件压缩为 gzip 格式,然后将其与 HTTP 写入响应一起发送。我的客户端收到 HTTP 200 状态,尽管响应的大小与我的文件相比非常小,并且没有任何内容不会填充我的 Web 应用程序。我预计浏览器会处理这种对发送 gzip 的服务器的响应。类似于 gmail 处理下载文件的方式。你能帮我看看我有没有遗漏什么吗?
server.js
var server = http.createServer(function(request, response) {
if (request.url === '/download'){
let data_zip = retrievedata()
const scopedata_zip = ('./scopedata.txt.gz')
response.writeHead(200, { 'Content-Encoding': 'gzip' });
response.writeHead(200, { 'Content-Type': 'application/javascript' });
response.write(scopedata_zip);
}
})
var retrievedata = () =>{
const gzip = zlib.createGzip();
const inp = fs.createReadStream('scopedata.txt');
const out = fs.createWriteStream('scopedata.txt.gz');
inp.pipe(gzip).pipe(out);
return out
}
客户端.js
var downloadData=()=>{
var xhr = new XMLHttpRequest();
xhr.open('POST', 'download', true);
//xhr.setRequestHeader("Accept-Encoding", "gzip")
xhr.setRequestHeader("Encoding", "null")
xhr.onload = function (){
if(this.status == 200){
let form = document.createElement("form");
let element1 = document.createElement("input");
document.body.appendChild(form);
let response = this.responseText
console.log(response)
document.getElementById("state").innerHTML = 'download'
document.getElementById("index").innerHTML = response;
// document.getElementById("state").appendChild(form)
}
}
xhr.onerror = function(err){
console.log("request error...",err)
}
xhr.send()
}
客户端只是填充我的索引 div 响应,但没有收到任何内容。
我的 gzip 文件是 327mb。 Chrome 检查器网络说这个请求只有 170B,所以我没有收到我的文件。
注意xhr.setRequestHeader("Accept-Encoding", "gzip") 被注释掉,因为我收到此错误:拒绝设置不安全的标头“Accept-Encoding”。我已将其设置为 null 以允许浏览器处理此问题。
关于我做错了什么有什么意见吗?
【问题讨论】:
-
我发现必须设置 HTTP 标头
Content-Disposition才能将文件作为附件处理以进行下载。 [developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… 。将我的服务器标头更新为response.setHeader('Content-disposition', 'attachment; filename=',file);,将我的客户端请求更新为xhr.setRequestHeader('Content-disposition', 'attachment; filename=',file);
标签: node.js http xmlhttprequest gzip