Skip to main content

Upload image and render image through AWS Gateway proxy+ lambda


 I searched internet for handling binary data in AWS Gateway for more than a week but I could not find any working sample code. Every where there was a bits and pieces but no one explained or provided sample working code through which I can upload an image or render an image.

So I am sharing below working sample code to handle binary data in AWS Gateway Proxy+

Below is the NodeJS example to upload and render image or binary data.

By default AWS Gateway does not enable processing binary data. So we have to go to settings and enable binary data as shown below

Copy this code in lambda index.js file and Deploy it.

const https = require('https');
const AWS = require('aws-sdk'); 

exports.handler = async (event) => {
    let response = '';

    let options = {
        method: event.httpMethod,
        hostname: '',
        path: ''
    };

    let apiResponse = await proxyRequest(options, event.body, event.isBase64Encoded);

    // Handling returning binary response from server
    let isBase64 = false;
    if((apiResponse.headers && apiResponse.headers['content-disposition'] && apiResponse.headers['content-disposition'].includes('attachment')) || 
                        (apiResponse.headers['content-type'] && apiResponse.headers['content-type'].includes('image'))) {
        isBase64 = true;
    } 

    response = {
        "statusCode": apiResponse.statusCode,
        "headers": apiResponse.headers,
        "body": apiResponse.data,
        "isBase64Encoded": isBase64
    };
    return response;
};

function proxyRequest(options, requestBody, isBodyBase64Encoded) {
    return new Promise((resolve, reject) => {
        let request = https.request(options, response => {
            let bodyData = [];

            response.on('data', chunk => {
                bodyData.push(chunk);
            });

            response.on('end', () => {
                try {
                    let resData = null;
                    if((response.headers && response.headers['content-disposition'] && response.headers['content-disposition'].includes('attachment')) || 
                        (response.headers['content-type'] && response.headers['content-type'].includes('image'))) {
                        resData = bodyData.length > 0 ? Buffer.concat(bodyData).toString('base64') : null;
                        console.log('base64 chunks');
                    }
                    else {
                        resData = bodyData.length > 0 ? Buffer.concat(bodyData).toString() : null;
                    }
                    resolve({
                        statusCode: response.statusCode,
                        headers: response.headers,
                        data: resData
                    });
                }
                catch (e) {
                    console.log('Error processing response: ', e);
                    reject(e);
                }
            });

            response.on('error', err => {
                console.log('unexpected error: ', err);
                reject(err);
            });
        });

        if (requestBody !== null)
            request.write(requestBody, isBodyBase64Encoded ? 'base64' : 'utf8');
            
        request.end();
    });
}

       
 

Comments

Popular posts from this blog

UML - Association, Aggregation, Composition, Generalization, Specialization, Realization and Dependency

Association Association is a simple relationship between two classes. For example A relationship between Professor Class and Student class is known as Association. Both Classes can exist without each other, so Professor and Student are two independent classes. In this kind of relationships there will not be any owner class. Both classes have their own life cycle. UML Notation:     Aggregation Aggregation is a special type of Association. It is known as “Has-A” relationship. For example A Department class can contain Professor Class. Here Department class is owner class. Here in this relationship even after deleting Department class, Professor Class can exits. UML Notation: Composition Composition is a special type of Aggregation. It is known as “Is-A” relationship. For example A University Class has many Department class. Here University and Department objects are dependent on each other. If we delete Univ...

C# Generic Factory

Implement Factory pattern using generics     public interface IDoWork   {       string DoWork();   }     Declare an Interface first by abstracting the common  functionality    Here I am taking the example of DoWork     public class Manager : IDoWork   {     public string DoWork()     {         return "Manager Manages School" ;     }   }     Implement the IDoWork in concrete classes as shown      public class Teacher : IDoWork     {         public string DoWork()         {             return "Teacher teaches student in school" ;         ...

Liskov substitution principle with simple example

Liskov Substitution Principle Definition 2 : Functions that use references to base classes must be able to use objects of derived classes without knowing it. Definition 2 : Object inheriting from base class or interface or other abstraction must be semantically substitutable for the original abstraction. Definition 3 : If a program module is using a Base Class, then the reference to the base class can be replaced with a derived class without affecting the functionality of the program module. Problem We all know that square is a rectangle from geometry. Now create a Rectangle base class with associated Height and Width properties and create Area() method to calculate the area in Rectangle base class.     public class Rectangle     {         public virtual int Height { get ; set ; }         public virtual int Width { get ; set ; }   ...