@tsrt/mparty-aws

Mparty AWS S3 Adapter - upload (stream) multipart/form-data directly to AWS S3

Usage no npm install needed!

<script type="module">
  import tsrtMpartyAws from 'https://cdn.skypack.dev/@tsrt/mparty-aws';
</script>

README

Typescript Reusable Tools: Mparty AWS S3 Adapter

npm version GitHub license Size Downloads

An Mparty AWS S3 Adapter.

Internally uses aws-sdk for managing file uploading / deletion. Thus all aws-sdk S3 config and upload config options are available for AwsAdapter as well.

Usage

For example express middleware:

import { Request, Response, Next } from 'express';

export async function uploadMiddleware(req: Request, res: Response, next: Next): Promise<void> {
  try {
    const adapter = new AwsAdapter({
      config: { credentials: { accessKeyId: 'accessKeyId', secretAccessKey: 'secretAccessKey' } }, 
      uploadOptions: { Bucket: 'Bucket' },
    });

    const fileNameFactory: FileNameFactory = (_req, _file, { originalFileName }) => `tenantSubDir/${Date.now()}_${originalFileName}`;

    const mparty = new Mparty({ adapter, fileNameFactory });
    const { fields, files, file } = mparty.upload(req);

    req.body = fields;
    req.files = files;
    req.file = file;

    next();
  } catch (err) {
    next(err);
  }
}
... or for multi-tenant system

Same example:

import { Request, Response, Next } from 'express';
import { SomeTenantService } from '@lib/services';

export async function uploadMiddleware(req: Request, res: Response, next: Next): Promise<void> {
  try {
    const { accessKeyId, secretAccessKey, Bucket, tenantSubDir } = await SomeTenantService.getTenantAwsConfigFromRequest(req);

    const adapter = new AwsAdapter({
      config: { credentials: { accessKeyId, secretAccessKey } }, 
      uploadOptions: { Bucket },
    });

    const fileNameFactory: FileNameFactory = (_req, _file, { originalFileName }) => `${tenantSubDir}/${Date.now()}_${originalFileName}`;

    const mparty = new Mparty({ adapter, fileNameFactory });
    const { fields, files, file } = mparty.upload(req);

    req.body = fields;
    req.files = files;
    req.file = file;

    next();
  } catch (err) {
    next(err);
  }
}

License

This project is licensed under the terms of the MIT license.