Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用快递寄回CSV_Javascript_Csv_File_Express_Save - Fatal编程技术网

Javascript 用快递寄回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

我是从JSON导出CSV的新手。。。我很快就会得到这个。。。但是我不知道如何将CSV从我的express服务器发送回客户端

用户选择要导出的客户,然后点击导出按钮。。。我想把CSV文件发回

我在服务器上将JSON数据转换为CSV,如何将此文件发送回客户端

这是我到目前为止的特快路线-

    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”);
    
  • 将字符串作为JSON发送,然后在前端将其解析为下载。这是最常见的方法

    这可以按如下所示进行:

    //使用前端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”);
    
  • 将字符串作为JSON发送,然后在前端将其解析为下载。这是最常见的方法

    这可以按如下所示进行:

    //使用前端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)
        }
    }