Nix
Nix

Reputation: 5

How can use busboy upload base64 data

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=

Upvotes: 0

Views: 2285

Answers (1)

robertklep
robertklep

Reputation: 203494

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

Upvotes: 3

Related Questions