我的数据以 JSON 格式驻留在 Postgres 服务器中。数据有数十万行。我希望向用户提供一个链接,以分块下载数据,即。不是一次所有数据,因为它会阻塞服务器上的内存。因此,我有一个 API 可以调用以循环获取有限的数据。我希望在从服务器收到响应后立即将数据以 CSV 格式写入客户端上的文件。
通常,我找到的解决方案是根据服务器的响应在客户端上构建数组,并且不会在收到响应后立即写入文件,当文件下载完成后,他们会将整个数组写入一次归档。但这里的问题是它开始消耗客户端的内存,因为你现在正在客户端上构建那个巨大的数据块,直到你将它写入文件。
所以我想采取的方法是,一旦从服务器检索到响应,我希望开始将其附加到文件中,这样我就不必将数据保存在客户的内存中。
我有这段代码正在执行普通数组到 CSV 的转换,但它没有将数据附加到同一个文件,而是创建了多个文件。
const writeDataToFile = (data) => {
const rows = data.map((obj) => Object.values(obj).join(delimiter));
const csvContent = rows.join('\n');
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
if (navigator.msSaveBlob) {
navigator.msSaveBlob(blob, filename);
} else {
const link = document.createElement('a');
if (link.download !== undefined) {
const url = URL.createObjectURL(blob);
link.setAttribute('href', url);
link.setAttribute('download', filename);
link.setAttribute('target', '_blank');
link.style.visibility = 'hidden';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
}
};