在nodejs中以windows-1251编码格式下载文件
Downloading file in windows-1251 encoding format in nodejs
我想创建和下载 windows-1251
格式的文本文件。当我尝试使用下面的代码时,文件下载成功,但不幸的是,格式为 utf-8
。关于我做错了什么有什么建议吗?
节点代码:
//node-version: v12.13.0
var iconv = require("iconv-lite");
//create txt file
router.post("/to-text", (req, res) => {
const arr = req.body.arr; //an array of objects
var file2 = iconv
.encodeStream("win1251")
.pipe(fs.createWriteStream(`filepath`));
file2.on("error", function (err) {
return res.status(500).json(err);
});
arr.forEach(function (v) {
const lastChar = v[1].slice(-1);
if (lastChar === "я") {
v[1] = v[1] + ".";
}
file2.write(v.join(",") + "\n");
});
file2.end();
returnres.send(file2);
});
//dowload txt file
router.get("/download", (req, res) => {
let file_path = `filepath`;
res.download(file_path);
});
反应代码:
const getText = () => {
let arr = [];
const date = `PLU_${Moment().format("L").split(".").join("")}.txt`;
productsList.map((e, idx) =>
arr.push(
Object.values({
a: e.hotkey,
b: e.name,
c: "",
})
)
);
// first request to save as text in filepath
Axios({
method: "POST",
url: "/myapi/to-text",
data: {
arr,
date,
type: prefixType.value,
},
responseType: "blob",
})
.then((data) => {
return data.data;
})
.then((resp) => {
closeModal();
return Axios.get("myapi/download", {
responseType: "blob",
params: { date },
})
.then((res) => res.data)
.then((response) => {
const url = window.URL.createObjectURL(
new Blob(
[
response,
],
{
type: "text/plain;charset=windows-1251",
}
)
);
const link = document.createElement("a");
link.href = url;
link.setAttribute("download", date);
document.body.appendChild(link);
link.click();
});
})
.catch((err) => {
ErrorAlert(err);
});
};
当 React 函数触发时,它首先在服务器端的文件路径中创建一个 txt
文件。然后使用第二个请求下载它。
要检查我使用的文件格式 Notepad++
,只需在编辑器中打开它并查看右下角即可。
我猜想缺少一些小细节,无法正确转换文件,但我看不到它(提前致谢。
我找到了解决问题的办法。我只需要在循环内对它进行一次编码,同时将 .writing
编码到文件中,例如:
file.write(iconv.encode(v.join(",") + "\n", "win1251"));
就是这样,在这个小操作之后,它将文件保存为 windows-1251
。显然,以相同的格式下载。
我想创建和下载 windows-1251
格式的文本文件。当我尝试使用下面的代码时,文件下载成功,但不幸的是,格式为 utf-8
。关于我做错了什么有什么建议吗?
节点代码:
//node-version: v12.13.0
var iconv = require("iconv-lite");
//create txt file
router.post("/to-text", (req, res) => {
const arr = req.body.arr; //an array of objects
var file2 = iconv
.encodeStream("win1251")
.pipe(fs.createWriteStream(`filepath`));
file2.on("error", function (err) {
return res.status(500).json(err);
});
arr.forEach(function (v) {
const lastChar = v[1].slice(-1);
if (lastChar === "я") {
v[1] = v[1] + ".";
}
file2.write(v.join(",") + "\n");
});
file2.end();
returnres.send(file2);
});
//dowload txt file
router.get("/download", (req, res) => {
let file_path = `filepath`;
res.download(file_path);
});
反应代码:
const getText = () => {
let arr = [];
const date = `PLU_${Moment().format("L").split(".").join("")}.txt`;
productsList.map((e, idx) =>
arr.push(
Object.values({
a: e.hotkey,
b: e.name,
c: "",
})
)
);
// first request to save as text in filepath
Axios({
method: "POST",
url: "/myapi/to-text",
data: {
arr,
date,
type: prefixType.value,
},
responseType: "blob",
})
.then((data) => {
return data.data;
})
.then((resp) => {
closeModal();
return Axios.get("myapi/download", {
responseType: "blob",
params: { date },
})
.then((res) => res.data)
.then((response) => {
const url = window.URL.createObjectURL(
new Blob(
[
response,
],
{
type: "text/plain;charset=windows-1251",
}
)
);
const link = document.createElement("a");
link.href = url;
link.setAttribute("download", date);
document.body.appendChild(link);
link.click();
});
})
.catch((err) => {
ErrorAlert(err);
});
};
当 React 函数触发时,它首先在服务器端的文件路径中创建一个 txt
文件。然后使用第二个请求下载它。
要检查我使用的文件格式 Notepad++
,只需在编辑器中打开它并查看右下角即可。
我猜想缺少一些小细节,无法正确转换文件,但我看不到它(提前致谢。
我找到了解决问题的办法。我只需要在循环内对它进行一次编码,同时将 .writing
编码到文件中,例如:
file.write(iconv.encode(v.join(",") + "\n", "win1251"));
就是这样,在这个小操作之后,它将文件保存为 windows-1251
。显然,以相同的格式下载。