Serving binary files

Small example showing how to serve binary files using Serverless on AWS with the serverless-apigw-binary plugin, using generated Excel files as an example

aws-nodejs-typescript-xlsx

Small example demonstrating how to return binary files using the Serverless framework, in this case Excel files.

When testing, you may need to sls remove and sls deploy again - seems like the changes don't always reach AWS.

Steps

Want to return binary files in an existing project? Here's how:

  • Install serverless-apigw-binary
$ npm install --save-dev serverless-apigw-binary
  • Add serverless-apigw-binary plugin in serverless.yml
 plugins:
   - serverless-webpack
+  - serverless-apigw-binary
  • Add plugin configuration in serverless.yml
plugins:
  - serverless-webpack
  - ...
  - serverless-apigw-binary

+custom:
+  apigwBinary:
+    types:
+      - '*/*'
  • Convert your binary file to base64
const binary: Buffer = ...;
const output = binary.toString('base64');

Or if you're also working with the xlsx library, you can write directly to base64:

const output = XLSX.write(wb, { type: 'base64', bookType: 'xlsx' });
  • Set isBase64Encoded: true and set the Content-Type and Content-Disposition headers on the response
export const xlsx: Handler = (event: APIGatewayEvent, context: Context, cb: Callback) => {
  const response = {
    statusCode: 200,
    body: output,
    headers: {
      'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
      'Content-Disposition': 'attachment; filename="hello.xlsx"',
    },
    isBase64Encoded: true,
  };

  cb(null, response);
}