Javascript 用快递寄回CSV
我是从JSON导出CSV的新手。。。我很快就会得到这个。。。但是我不知道如何将CSV从我的express服务器发送回客户端 用户选择要导出的客户,然后点击导出按钮。。。我想把CSV文件发回 我在服务器上将JSON数据转换为CSV,如何将此文件发送回客户端 这是我到目前为止的特快路线-Javascript 用快递寄回CSV,javascript,csv,file,express,save,Javascript,Csv,File,Express,Save,我是从JSON导出CSV的新手。。。我很快就会得到这个。。。但是我不知道如何将CSV从我的express服务器发送回客户端 用户选择要导出的客户,然后点击导出按钮。。。我想把CSV文件发回 我在服务器上将JSON数据转换为CSV,如何将此文件发送回客户端 这是我到目前为止的特快路线- router.post('/SaveCSV', (req, res) => { const csv = JSONToCSV(req.body, { fields: ["Custom
router.post('/SaveCSV', (req, res) => {
const csv = JSONToCSV(req.body, { fields: ["Customer Name", "Business Name", "Customer Email", "Customer ID", "School ID", "Student Count", "Admin Count", "Courses Count" ]})
})
我已尝试res.send、res.sendFile和res.attachment。。有什么指导吗
更新***
router.post('/SaveCSV', (req, res) => {
const csv = JSONToCSV(req.body, { fields: ["Customer Name", "Business Name", "Customer Email", "Customer ID", "School ID", "Student Count", "Admin Count", "Courses Count" ]})
res.attachment('CustomerData.csv').send(csv)
})
这是我对客户的取回电话--
JSONtoCSV
可能会从JSON生成一个CSV格式的字符串
从这个字符串中,您有两个选项
res.sendFile
该文件
这可以这样做
我建议使用,虽然你可以用香草。只需创建文件并将字符串写入其中,然后通过res.sendFile
发送即可
const csv=new ObjectsToCsv(csvdata);
等待csv.toDisk(“./data.csv”);
res.sendFile(“./data.csv”);
//使用前端CSV库将其解析为CSV。
//然后,创建一个隐藏元素并自动下载该文件。
var hiddenElement=document.createElement('a');
hiddenElement.href='数据:文本/csv;字符集=utf-8,'+encodeURI(csv);
hiddenElement.target='_blank';
hiddenElement.download='exported.csv';
hiddenElement.click();
JSONtoCSV
可能会从JSON生成一个CSV格式的字符串
从这个字符串中,您有两个选项
res.sendFile
该文件
这可以这样做
我建议使用,虽然你可以用香草。只需创建文件并将字符串写入其中,然后通过res.sendFile
发送即可
const csv=new ObjectsToCsv(csvdata);
等待csv.toDisk(“./data.csv”);
res.sendFile(“./data.csv”);
//使用前端CSV库将其解析为CSV。
//然后,创建一个隐藏元素并自动下载该文件。
var hiddenElement=document.createElement('a');
hiddenElement.href='数据:文本/csv;字符集=utf-8,'+encodeURI(csv);
hiddenElement.target='_blank';
hiddenElement.download='exported.csv';
hiddenElement.click();
在服务器端,您只需
将
CSV数据发送回即可。但是,默认情况下,这将随内容类型text/html
一起提供-最好使用正确的类型text/csv
发送。这可以通过首先使用res.type('text/csv')
来完成
现在,如果您不将浏览器导航到您的端点,而是在前端代码中以编程方式使用下载,那么这是否有必要存在争议,但是:要将其标记为“下载”(不应显示,但实际保存到文件),您可以使用res.attachment()
。如果指定一个文件名,它也会在标题中发送该文件名,但也会根据扩展名自动设置内容类型。例如,您可以使用res.attachment('customers.csv').send(csv)
。如果浏览器导航到您的URL,它会将CSV视为名为customers.CSV
的文件下载
router.post('/SaveCSV',(req,res)=>{
const csv=JSONToCSV(请求正文,{字段:[“客户名称”、“企业名称”、“客户电子邮件”、“客户ID”、“学校ID”、“学生人数”、“管理员人数”、“课程人数”]})
res.attachment('customers.csv').send(csv)
})
在客户端,您可以使用response.blob()
将原始响应主体作为blob获取,然后让用户下载该blob。要了解更多关于如何做到这一点的解释,你可以在网上进行研究(关于这一点有很多参考资料)。自动获得正确文件名并与传统浏览器配合使用的完整示例是(也在注释中链接到)-请注意,您需要text/csv
,而不是application/pdf
,或者从响应中读取内容类型
让我发布一个功能较少的简化示例:
const blob=wait response.blob()
const link=document.createElement('a')
link.href=URL.createObjectURL(blob)
link.download='customers.csv'
link.click()
setTimeout(()=>URL.revokeObjectURL(link.href),0)
但让我们好好想想。根据您显示的代码,您的服务器代码所做的只是从前端获取数据,将其填充到CSV中并发送回。我会说,你根本不需要服务器!首先,您可以在前端代码中完成全部工作
const saveCsv=(客户)=>{
const csv=JSONToCSV(客户,{字段:[“客户名称”、“企业名称”、“客户电子邮件”、“客户ID”、“学校ID”、“学生人数”、“管理员人数”、“课程人数”]})
const link=document.createElement('a')
link.href='data:text/csv',+encodeURIComponent(csv)
link.download='customers.csv'
link.click()
}
当然,这假设您可以在前端提供
jsontosv
库,或者您可以添加自己的函数来构建CSV数据。在服务器端,您只需将CSV数据发送回即可。但是,默认情况下,这将随内容类型text/html
一起提供-最好使用正确的类型text/csv
发送。这可以通过首先使用res.type('text/csv')
来完成
现在,如果您不在br中导航,是否有必要这样做还有争议
const saveCsv = async (customers) => {
const token = await getAccessTokenSilently();
try {
const response = await fetch('/api/SaveCSV', {
method: 'POST',
headers: {
Authorization: `Bearer ${token}`,
"content-type": 'application/json; Charset=UTF-8'
},
body: JSON.stringify(customers)
})
const responseData = await response.json()
console.log(responseData)
} catch (error) {
console.log(error)
}
}