在 javascript 中使用 fetch 时访问 Headers
Access Headers when using fetch in javascript
我正在使用以下方法从我的 nodejs 服务器向浏览器发送一个 zip 文件
res.set("Content-Type", "application/octet-stream");
res.set("Content-disposition", `attachment; filename="`+zip_name+`.zip"`);
res.set("Content-Length", zipBuff.length);
res.send(zipBuff);
然后我使用 :
获取它
fetch("/my/url", {
method: "POST",
body: formData,
})
.then(response => {
return response.blob();
})
.then(response => {
const blob = new Blob([response], {type: 'application/zip'});
const downloadUrl = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = downloadUrl;
a.download = "blah.zip";
document.body.appendChild(a);
a.click();
});
我希望能够使用 zip_name
而不是 blah
作为文件名,但我不知道如何访问 headers(在那种情况下 Content-disposition
) 的响应 fetch
.
有人可以解释一下这是怎么做到的吗?
Return blob 和 headers 在 object
fetch("/my/url", {
method: "POST",
body: formData,
})
.then(response => {
const headers = response.headers
return { blob: response.blob(), headers }
})
.then(({blob, headers}) => {
/// now you can access to **headers** and blob data
});
更新:
要访问 headers 使用 headers.get("Header name").split('=').pop()
UPD1:
const foo = async () => {
const response = await fetch("/my/url", {
method: "POST",
body: formData,
})
if(!response.ok)
thorw new Error("Some error happend")
const blod_data = await response.blob()
const header_with_name = response.headers.get("Header name").split('=').pop()
// do something with it
}
在第一个承诺箭头函数中,您可以访问 HTTP 响应 header。如果您将其更新为 return 来自 blob
函数调用的承诺。然后在这个嵌套函数中,您可以 return 一个包含 header 值的 object 到处理 blob 数据的外部第二个箭头函数。
更新了提取示例,其中包括处理 return 来自 blob-function 调用的 Promise。
fetch("/my/url", {
method: "POST",
body: formData,
})
.then(response => {
return response.blob().then((data) => {
return {
data: data,
filename: response.headers.get('Content-disposition'),
};
});
})
.then(({ data, filename }) => {
const blob = new Blob([data], { type: 'application/zip' });
const downloadUrl = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = downloadUrl;
a.download = filename.split('=')[1];
document.body.appendChild(a);
a.click();
});
感谢 Chapo 指出我之前示例的问题
我正在使用以下方法从我的 nodejs 服务器向浏览器发送一个 zip 文件
res.set("Content-Type", "application/octet-stream");
res.set("Content-disposition", `attachment; filename="`+zip_name+`.zip"`);
res.set("Content-Length", zipBuff.length);
res.send(zipBuff);
然后我使用 :
获取它fetch("/my/url", {
method: "POST",
body: formData,
})
.then(response => {
return response.blob();
})
.then(response => {
const blob = new Blob([response], {type: 'application/zip'});
const downloadUrl = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = downloadUrl;
a.download = "blah.zip";
document.body.appendChild(a);
a.click();
});
我希望能够使用 zip_name
而不是 blah
作为文件名,但我不知道如何访问 headers(在那种情况下 Content-disposition
) 的响应 fetch
.
有人可以解释一下这是怎么做到的吗?
Return blob 和 headers 在 object
fetch("/my/url", {
method: "POST",
body: formData,
})
.then(response => {
const headers = response.headers
return { blob: response.blob(), headers }
})
.then(({blob, headers}) => {
/// now you can access to **headers** and blob data
});
更新:
要访问 headers 使用 headers.get("Header name").split('=').pop()
UPD1:
const foo = async () => {
const response = await fetch("/my/url", {
method: "POST",
body: formData,
})
if(!response.ok)
thorw new Error("Some error happend")
const blod_data = await response.blob()
const header_with_name = response.headers.get("Header name").split('=').pop()
// do something with it
}
在第一个承诺箭头函数中,您可以访问 HTTP 响应 header。如果您将其更新为 return 来自 blob
函数调用的承诺。然后在这个嵌套函数中,您可以 return 一个包含 header 值的 object 到处理 blob 数据的外部第二个箭头函数。
更新了提取示例,其中包括处理 return 来自 blob-function 调用的 Promise。
fetch("/my/url", {
method: "POST",
body: formData,
})
.then(response => {
return response.blob().then((data) => {
return {
data: data,
filename: response.headers.get('Content-disposition'),
};
});
})
.then(({ data, filename }) => {
const blob = new Blob([data], { type: 'application/zip' });
const downloadUrl = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = downloadUrl;
a.download = filename.split('=')[1];
document.body.appendChild(a);
a.click();
});
感谢 Chapo 指出我之前示例的问题