Skip to content

Naming Strategies

A naming strategy decides the stored file name/key from the uploaded file's contents and original name:

ts
type NamingStrategy = (
  file: Uint8Array,
  originalName: string,
) => string | Promise<string>;

Built in

StrategyProduces
UuidNamingStrategy (default)<uuid-v7><ext>
OriginalNamingStrategythe original file name, unchanged
HashNamingStrategy<sha256-of-contents><ext> — natural de-duplication
DatePathNamingStrategy<yyyy>/<mm>/<dd>/<original-name-without-ext><ext>
DatePathUuidNamingStrategy<yyyy>/<mm>/<dd>/<uuid-v7><ext>

Date components use the local system clock at call time, zero-padded to 2 digits for month/day.

Setting a strategy

Set one per disk:

ts
disks: {
  local: {
    driver: 'local',
    config: { location: './storage' },
    namingStrategy: HashNamingStrategy,
  },
},

Or override it per upload (see File Uploads):

ts
StorageFileInterceptor('avatar', { namingStrategy: HashNamingStrategy });

Writing your own

A naming strategy is just a function — synchronous or async:

ts
import { NamingStrategy } from '@oxth/nestjs-storage';

export const SlugNamingStrategy: NamingStrategy = (file, originalName) => {
  return `${slugify(originalName)}-${Date.now()}`;
};

Released under the MIT License.