2015-02-08 78 views
0

我在想,如果有人知道如何使用快车时,提取上传文件的文件内容/的NodeJS解析文件内容上传

我有下面的代码,它是清楚如何管道输入到FILESTREAM ,但我如何反序列化上传到一个普通的JavaScript对象?目的是从上传的文件中提取信息并在其他地方使用。理想情况下,我不想通过磁盘上的临时文件。该文件的格式是json。

app.post("/upload", function(req, res){ 

    req.pipe(req.busboy); 

    req.busboy.on('file', function (fieldname, file, filename) { 

     console.log("Uploading: " + filename); 
     console.log(file); 
     console.log(fieldname); 

     // I don't want to go via a file, but straight to a JS object 


     //fstream = fs.createWriteStream('/files/' + filename); 
     // 
     //file.pipe(fstream); 
     // 
     //fstream.on('close', function() { 
     // 
     // res.redirect('back'); 
     // 
     //}); 
    }); 
}); 

文件上载是触发这样的:

var formData = new FormData($('form')[0]); 

     e.preventDefault(); 

     $.ajax({ 
      url: 'upload', 
      type: 'POST', 
      data: formData, 
      cache: false, 
      dataType:'json', 
      contentType: false, 
      enctype: 'multipart/form-data', 
      processData: false, 
      success: function (response) { 
      } 
     }); 
+0

是否有当你使用'file.on('data',...)'或者使用一个像[JSONStream]这样的模块的内存中的所有数据时,你不能使用'JSON.parse'(https: //www.npmjs.com/package/JSONStream) – 2015-02-08 22:58:13

+0

我试过json.parse,但是t他似乎将文件作为字符串提交给服​​务器,并且换行符似乎会导致解析器出现问题。 – TGH 2015-02-09 03:54:38

回答

1

如果你不介意的第一个缓冲文件的内容,你可以做这样的事情:

app.post("/upload", function(req, res){ 
    req.pipe(req.busboy); 
    req.busboy.on('file', function (fieldname, file, filename) { 
    var buf = ''; 
    file.on('data', function(d) { 
     buf += d; 
    }).on('end', function() { 
     var val = JSON.parse(buf); 
     // use `val` here ... 
    }).setEncoding('utf8'); 
    }); 
}); 
+0

然后有效的JSON被*发送*。你可以发布“buf”中包含的示例数据吗? – mscdex 2015-02-09 03:53:50

+0

有趣......看起来整个问题是由json文件中单引号与双引号的不一致引起的 – TGH 2015-02-09 03:59:44