0

For example:
1. Test1.txt Its base64:VGhpcyBpcyB0ZXN0MS4=
2. Test2.txt Its base64:VGhpcyBpcyBUZXN0Mi4=

My code:

req.busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
    console.log('File: ' + filename + ', mimetype: ' + mimetype);
    file.pipe(base64.encode()).pipe(output);
    var i = 0;
    output.on('data', function(data) {
    console.log('File [' + filename + '] size: ' + data.length + ' bytes');
    base64data[i] = data;
    i++;
    });
    output.on('end', function(){
        console.log('Data: ' + base64data);
    });
});

Output:
File: Test1.txt, mimetype: text/plain
File: Test2.txt, mimetype: text/plain
File [Test1.txt] size: 16 bytes
File [Test2.txt] size: 16 bytes
File [Test1.txt] size: 16 bytes
File [Test2.txt] size: 16 bytes
File [Test1.txt] size: 4 bytes
File [Test2.txt] size: 4 bytes
File [Test1.txt] size: 4 bytes
File [Test2.txt] size: 4 bytes
Data: VGhpcyBpcyB0ZXN0,VGhpcyBpcyBUZXN0,MS4=,Mi4=
Data: VGhpcyBpcyB0ZXN0,VGhpcyBpcyBUZXN0,MS4=,Mi4=

This result is not correct. I want the right result:
Data:VGhpcyBpcyB0ZXN0MS4=,VGhpcyBpcyBUZXN0Mi4=
How do I modify this code? Help!

Reference robertklep's code:

var base64data = [];
var chunks = [];
var output = new stream.PassThrough();

req.busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
    console.log('File: ' + filename + ', mimetype: ' + mimetype);
    file.pipe(base64.encode()).pipe(output);
    output.on('data', function(data) {
        chunks.push(data);
        console.log('Chunks: ' + chunks);
    });
    output.on('end', function(){
        base64data.push(Buffer.concat(chunks));
        console.log('Data1: ' + base64data);
    });
}).on('finish', function(){
    console.log('Data2:' + base64data)
});

Output:

File: Test1.txt, mimetype: text/plain
File: Test2.txt, mimetype: text/plain
Chunks: VGhpcyBpcyB0ZXN0
Chunks: VGhpcyBpcyB0ZXN0,VGhpcyBpcyB0ZXN0
Chunks: VGhpcyBpcyB0ZXN0,VGhpcyBpcyB0ZXN0,VGhpcyBpcyBUZXN0
Chunks: VGhpcyBpcyB0ZXN0,VGhpcyBpcyB0ZXN0,VGhpcyBpcyBUZXN0,VGhpcyBpcyBUZXN0
Chunks: VGhpcyBpcyB0ZXN0,VGhpcyBpcyB0ZXN0,VGhpcyBpcyBUZXN0,VGhpcyBpcyBUZXN0,
MS4=
Chunks: VGhpcyBpcyB0ZXN0,VGhpcyBpcyB0ZXN0,VGhpcyBpcyBUZXN0,VGhpcyBpcyBUZXN0,
MS4=,MS4=
Chunks:VGhpcyBpcyB0ZXN0,VGhpcyBpcyB0ZXN0,VGhpcyBpcyBUZXN0,VGhpcyBpcyBUZXN0,
MS4=,MS4=,Mi4=
Chunks: VGhpcyBpcyB0ZXN0,VGhpcyBpcyB0ZXN0,VGhpcyBpcyBUZXN0,VGhpcyBpcyBUZXN0,
MS4=,MS4=,Mi4=,Mi4=
Data2:
Data1: VGhpcyBpcyB0ZXN0VGhpcyBpcyB0ZXN0VGhpcyBpcyBUZXN0VGhpcyBpcyBUZXN0
MS4=MS4=Mi4=Mi4=
Data1: VGhpcyBpcyB0ZXN0VGhpcyBpcyB0ZXN0VGhpcyBpcyBUZXN0VGhpcyBpcyBUZXN0
MS4=MS4=Mi4=Mi4=,VGhpcyBpcyB0ZXN0VGhpcyBpcyB0ZXN0VGhpcyBpcyBUZXN0VGhpcy
BpcyBUZXN0MS4=MS4=Mi4=Mi4=
Nix
  • 5
  • 2
  • 6

1 Answers1

3

You're pushing chunks belonging to different files onto the same array, and also, you need to wait for all files to be processed before you can log it like you want:

var base64data = [];

req.busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
  file.pipe(base64.encode()).pipe(output);
  var chunks = [];
  output.on('data', function(data) {
    chunks.push(data);
  });
  output.on('end', function(){
    base64data.push(Buffer.concat(chunks));
  });
}).on('finish', function() {
  console.log('Data: ' + base64data);
});
robertklep
  • 198,204
  • 35
  • 394
  • 381
  • Thank you for your answer, but when I tested new code, data2 is null, I can’t get result. Chunks repeated twice and alternately, please see above output. I looking forward to your suggestion. – Nix Jun 30 '15 at 02:19
  • @Nix you're _not_ using my exact code. For instance, you moved `chunks` to outside the `file` handler, which isn't going to work. – robertklep Jun 30 '15 at 05:54
  • Oh! Thank you very much! I must put chunks and ouput inside the file handler, the result is right. – Nix Jun 30 '15 at 07:07