From 45763ecc05c2d90494fe0a211b7a79266748cd67 Mon Sep 17 00:00:00 2001 From: tmeunier Date: Mon, 30 Mar 2026 20:56:32 +0200 Subject: [PATCH] feat(drive): add local filesystem storage configuration and support --- app/services/images/image_transform_service.ts | 4 +++- config/drive.ts | 7 +++++++ start/env.ts | 12 ++++++------ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/services/images/image_transform_service.ts b/app/services/images/image_transform_service.ts index ee6f273..f3a6161 100644 --- a/app/services/images/image_transform_service.ts +++ b/app/services/images/image_transform_service.ts @@ -5,6 +5,7 @@ import { createHash } from 'node:crypto' import drive from '@adonisjs/drive/services/main' import { existsSync } from 'node:fs' import { join } from 'node:path' +import env from '#start/env' export type SupportedFormat = 'webp' | 'png' | 'jpeg' | 'avif' export type SupportedFit = keyof FitEnum @@ -42,6 +43,7 @@ const FIT_MAP: Record = { @inject() export default class ImageTransformService { private readonly cacheDir = './storage/.cache/images' + private readonly driverDisk = env.get('DRIVE_DISK') ?? 'secret-key' async transform(options: TransformOptions): Promise { const { src, width, height, quality = 80, format = 'webp', fit = 'cover' } = options @@ -76,7 +78,7 @@ export default class ImageTransformService { } private async fetchFromDrive(src: string): Promise { - const stream = await drive.use('s3').getStream(src) + const stream = await drive.use(this.driverDisk).getStream(src) const chunks: Buffer[] = [] for await (const chunk of stream) chunks.push(Buffer.from(chunk)) return Buffer.concat(chunks) diff --git a/config/drive.ts b/config/drive.ts index 0ca54c5..d6c6a1f 100644 --- a/config/drive.ts +++ b/config/drive.ts @@ -1,5 +1,6 @@ import env from '#start/env' import { defineConfig, services } from '@adonisjs/drive' +import app from '@adonisjs/core/services/app' const driveConfig = defineConfig({ default: env.get('DRIVE_DISK'), @@ -9,6 +10,12 @@ const driveConfig = defineConfig({ * services each using the same or a different driver. */ services: { + fs: services.fs({ + location: app.makePath('storage'), + serveFiles: true, + routeBasePath: '/uploads', + visibility: 'public', + }), s3: services.s3({ credentials: { accessKeyId: env.get('AWS_ACCESS_KEY_ID'), diff --git a/start/env.ts b/start/env.ts index 0e6cd03..46cfcfe 100644 --- a/start/env.ts +++ b/start/env.ts @@ -42,10 +42,10 @@ export default await Env.create(new URL('../', import.meta.url), { | Variables for configuring the drive package |---------------------------------------------------------- */ - DRIVE_DISK: Env.schema.enum(['s3'] as const), - AWS_ACCESS_KEY_ID: Env.schema.string(), - AWS_SECRET_ACCESS_KEY: Env.schema.string(), - AWS_REGION: Env.schema.string(), - S3_BUCKET: Env.schema.string(), - S3_FORCE_PATH_STYLE: Env.schema.boolean(), + DRIVE_DISK: Env.schema.enum(['s3', 'fs'] as const), + AWS_ACCESS_KEY_ID: Env.schema.string.optional(), + AWS_SECRET_ACCESS_KEY: Env.schema.string.optional(), + AWS_REGION: Env.schema.string.optional(), + S3_BUCKET: Env.schema.string.optional(), + S3_FORCE_PATH_STYLE: Env.schema.boolean.optional(), })