Skip to content

climba03003/fastify-formidable

Repository files navigation

fastify-formidable

Continuous Integration Package Manager CI NPM version GitHub package.json version GitHub

This plugin add a handy parser for multipart/form-data by using formidable and provide a better integration between multipart/form-data and fastify-swagger

Install

npm install fastify-formidable --save

yarn add fastify-formidable

Usage

import FastifyFormidable, { kFileSavedPaths, kIsMultipart, kIsMultipartParsed } from 'fastify-formidable'

fastify.register(FastifyFormidable)

fastify.post('/', async function(request, reply) {
  // you need to call the parser if you do not pass any option through plugin registration
  await request.parseMultipart()

  // access files
  request.files

  // access body
  // note that file fields will exist in body and it will becomes the file path saved on disk
  request.body

  // access all the files path
  request[kFileSavedPaths]

  // check if it is multipart
  if( request[kIsMultipart] === true ) {}

  // check if it is already parsed
  if ( request[kIsMultipartParsed] === true ) {}
})

// add content type parser which will automatic parse all `multipart/form-data` found
fastify.register(FastifyFormidable, {
  addContentTypeParser: true
})

// add `preValidation` hook which will automatic parse all `multipart/form-data` found
fastify.register(FastifyFormidable, {
  addHooks: true
})

Options

options.formidable

The options which will be directly passed to formidable.

import FastifyFormidable from 'fastify-formidable'

fastify.register(FastifyFormidable, {
  formidable: {
    maxFileSize: 1000,
    // this folder will be automatic created by this plugin
    uploadDir: '/'
  }
})

See: formidable

options.removeFilesFromBody

This options will add a preHandler hooks to remove files from body.

import FastifyFormidable from 'fastify-formidable'

fastify.register(FastifyFormidable, {
  removeFilesFromBody: true
})

Integration

It is a known limitation for fastify-multipart integrate with fastify-swagger and this plugin provide a relatively simple solution for the integration.

import Fastify from 'fastify'
import FastifyFormidable, { ajvBinaryFormat } from 'fastify-formidable'
import FastifySwagger from 'fastify-swagger'

const fastify = Fastify({
  ajv: {
    plugins: [ ajvBinaryFormat ]
  }
})

fastify.register(FastifyFormidable, {
  addContentTypeParser: true
})

fastify.register(FastifySwagger)