如何解决为什么从node.js后端下载的csv文件不包含csv数据?
我有一个vue.js应用程序,后端有node.js。我正在尝试在后端构建一个csv文件,并将其作为文件下载发送到前端。它不起作用。
这是我从后端返回的内容:
从ListingController.getListingsCSV():
async getListingsCSV(user,listingIds) {
/* convert listings to csv string. This is working. */
return {
body: headersString + "/n" + csvString,type: "text/csv",filename: "listing.csv"
};
}
headersString是标题的逗号分隔列表,而csvString是值的逗号分隔列表。
然后在处理所有请求的index.js中,我返回此代码:
if (rh.match(event,"GET","/listings/csv")) {
const res = await require("./listings/ListingController").getListingsCSV(
user,qParams.listingIds.split(",")
);
return new HttpResponse(
200,res.toString("base64"),{ "content-type": "text/csv" },true
);
}
在前端,我有这个:
window.open(
`/api/listings/csv?listingIds=${this.listingId}`,"_blank"
);
当我触发下载时,我得到一个文件,其内容为:
¡¸ÞrÓ›ç-
我不知道那是什么。绝对不是我所期望的CSV。此外,它似乎忽略了我提供的文件名:“ listing.csv”,而是将其命名为“ csv”(无扩展名)。
前端和后端均未在日志中显示任何错误。 Chrome和Firefox中的“网络”标签仅显示200个状态代码。
这里会发生什么?
解决方法
解决方案是返回此值:
return new HttpResponse(
200,res.body,{
"content-type": res.type,"content-disposition": `attachment; filename="${res.filename}"`
},false
);
首先,我将getListingCSV()返回的整个对象作为HttpResponse的主体返回。我将其更改为res.body。
第二,我删除了base 64编码,因为根本没有必要。
第三,我添加了content-disposition来适当地设置文件名。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。