0

I want to crop an image into various sizes and upload them to AWS S3. Cropping sizes are stored in an array.

I am using async waterfall and series method to achieve this.

async.each(crop_sizes,function (result,cb) {

            async.waterfall([
                /*
                 * Crop the images to specific size
                 */
                function (callback) {
                    gm(path)
                        .resize(result.width,result.height,'^')
                        .stream(function (err,buffer) {
                            console.log('cropped')
                            callback(null,{'buffer':buffer,'filename':filename,'s3':s3});
                        });
                },
                function (output,callback) {
                    var params ={
                        Bucket:'mybucket',
                        Key:'artwork-croppedimages/'+result.folder+output.filename,
                        Body:output.buffer
                    }

                    var options ={
                        partSize: 5242880, queueSize: 1
                    };

                    s3.upload(params,options,function(err, data) {
                        console.log("upload");

                        callback();
                    });
                }

            ],function (err,result) {
                console.log("one iteration completed");
                cb();
            });
        },function (err,result) {
            console.log("All upload complete");
        });

This is how the code should execute:

Repeat steps 1 and 2 in async.each.

  1. Crop the image.

  2. Upload the cropped image to AWS S3.

But it fails while uploading large sized images. This is the output I get:

cropped
cropped
cropped
cropped
cropped
cropped
cropped
cropped
cropped
cropped
cropped
cropped
upload
one iteration completed
upload
one iteration completed
upload
one iteration completed
upload
one iteration completed
upload
one iteration completed
upload
one iteration completed
upload
one iteration completed
upload
one iteration completed
upload
one iteration completed
upload
one iteration completed
upload
one iteration completed
upload
one iteration completed
All upload complete

Expected output:

 cropped
   upload
   one iteration completed
  cropped
   upload
   one iteration completed
   .....
  All upload complete
Aanchal1103
  • 917
  • 8
  • 21
Jabaa
  • 1,743
  • 7
  • 31
  • 60

1 Answers1

0

Can you try async.eachOfSeries function? I doubt that async.each function runs the iteratee parallelly (as mentioned in docs), this must be causing the issue.

Ashish Santikari
  • 443
  • 4
  • 19