【问题标题】:How do I stream a file and keep the encoding as ansi (windows-1252) in Node.js如何在 Node.js 中流式传输文件并将编码保持为 ansi (windows-1252)
【发布时间】:2014-05-21 03:04:57
【问题描述】:

我使用 Formidable 将文件上传到我的 Node-js 网络服务器(用于测试的本地安装)。该文件在我上传之前在ansi(iso-8859-1)中,并且在上传时仍然是,我已经使用Notepad ++检查了该文件。

var form = new formidable.IncomingForm();

    form.parse(req, function(err, fields, files) {

            csv
            .fromPath(files.upfile.path, {headers: true})
            .on("record", function(data){
                console.log(data.adresse);
            })
            .on("end", function(){
                console.log("done");
            });

            res.end(console.log("form done"));

        });

只要我使用流或使用节点 fs 流式传输内容的插件(在本例中为 fast-csv),编码就会出错。看下面的数据,?应该是丹麦字符 ø。

{adresse: 'Niver?d By, Karlebo'}

谁能告诉我为什么?

更新:

它通过流式传输上传的文件并使用 Iconv 对其进行转换。

router.post('/upload', function(req, res) {

    var form = new formidable.IncomingForm();


        form.parse(req, function(err, fields, files) {

            console.log(files.upfile.path);

            var stream = fs.createReadStream(files.upfile.path);

            var csvStream = csv({headers : true})
             .on("record", function(data){
                 var db = req.db;

                // Set our collection
                var collection = db.get('bbrcollection');

                // Submit to the DB
                collection.insert(data, function (err, doc) {

                //console.log(data);

                    if (err) {
                        // If it failed, return error
                        console.log("There was a problem adding the information to the database.");
                    }
                });
             })
             .on("end", function(){
                 console.log("done");
             });

            stream
                .pipe(new Iconv('WINDOWS-1252', 'UTF-8'))
                .pipe(csvStream);

        });


  res.render('upload', { title: 'upload file'});
});

【问题讨论】:

    标签: node.js character-encoding


    【解决方案1】:

    您必须将编码转换为 utf8 才能使用 javascript 中的内容。 iconviconv-lite 都应该能够为您做到这一点。

    【讨论】:

    • 我什么时候应该这样做?流式传输时?使用 Formidable 甚至之前保存文件时?
    • 两个模块都支持流式传输,因此您可以将文件的副本流式传输到其中一个模块并解析它,同时通过 Formidable 将原始文件保存在磁盘上(如果您需要在磁盘上保留一份是)。或者在文件全部保存到磁盘后执行此操作(就像您现在所做的那样)。
    猜你喜欢
    • 2012-10-26
    • 2021-07-12
    • 1970-01-01
    • 2017-10-19
    • 2013-05-16
    • 2011-05-22
    • 2019-08-11
    • 1970-01-01
    相关资源
    最近更新 更多