如何流式传输文件并将编码保留为Node.js中的ansi(windows-1252)

时间:2014-05-14 20:03:51

标签: node.js character-encoding

我使用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"));

        });

一旦我使用流或插件(在这种情况下为fast-csv)使用节点fs来流式传输内容,编码就会变得拙劣。看下面的数据,?应该是丹麦人的角色ø。

{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'});
});

1 个答案:

答案 0 :(得分:2)

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