import multer from "multer";
import { Request } from "express";
export interface UploadConfig {
    storage?: 'disk' | 'memory';
    uploadDir?: string;
    allowedMimeTypes?: string[];
    allowedExtensions?: string[];
    maxFileSize?: number;
    useTimestamp?: boolean;
    sanitizeFilenames?: boolean;
    customNaming?: (file: Express.Multer.File) => string;
    createDirIfNotExists?: boolean;
    preserveOriginalName?: boolean;
}
export interface FileValidationResult {
    isValid: boolean;
    error?: string;
}
export interface MulterUtilityRequest extends Request {
    file?: Express.Multer.File;
    files?: Express.Multer.File[] | {
        [fieldname: string]: Express.Multer.File[];
    };
}
export declare class UploadService {
    private readonly config;
    private readonly uploader;
    private static readonly DEFAULT_CONFIG;
    constructor(config?: UploadConfig);
    /**
     * Ensure upload directory exists
     */
    private ensureUploadDirExists;
    /**
     * Get storage engine based on configuration
     */
    private getStorageEngine;
    /**
     * Generate filename based on configuration
     */
    private generateFilename;
    /**
     * File filter for validation
     */
    private fileFilter;
    /**
     * Validate file against configured rules
     */
    validateFile(file: Express.Multer.File): FileValidationResult;
    /**
     * Upload single file
     */
    single(fieldName: string): import("express").RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
    /**
     * Upload multiple files (array)
     */
    array(fieldName: string, maxCount?: number): import("express").RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
    /**
     * Upload multiple files (different fields)
     */
    fields(fields: multer.Field[]): import("express").RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
    /**
     * Handle any files
     */
    any(): import("express").RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
    /**
     * No files expected
     */
    none(): import("express").RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
    /**
     * Get upload configuration
     */
    getConfig(): Required<UploadConfig>;
    /**
     * Get file info for uploaded file
     */
    getFileInfo(file: Express.Multer.File): {
        originalName: string;
        filename: string;
        mimetype: string;
        size: number;
        encoding: string;
        fieldname: string;
        destination: string;
        path: string;
        buffer: Buffer<ArrayBufferLike>;
    };
    /**
     * Delete uploaded file (disk storage only)
     */
    deleteFile(filename: string): Promise<boolean>;
    /**
     * Check if file exists (disk storage only)
     */
    fileExists(filename: string): boolean;
    /**
     * Get file path (disk storage only)
     */
    getFilePath(filename: string): string;
    /**
     * Get upload directory stats
     */
    getUploadStats(): Promise<{
        message: string;
        totalFiles?: undefined;
        totalSize?: undefined;
        files?: undefined;
    } | {
        totalFiles: number;
        totalSize: number;
        files: {
            name: string;
            size: number;
            created: Date;
            modified: Date;
        }[];
        message?: undefined;
    }>;
}
export declare const createDiskUploader: (uploadDir: string, config?: Partial<UploadConfig>) => UploadService;
export declare const createMemoryUploader: (config?: Partial<UploadConfig>) => UploadService;
export declare const createImageUploader: (uploadDir?: string) => UploadService;
export declare const createAudioUploader: (uploadDir?: string) => UploadService;
export { MulterError } from 'multer';
export type { Request } from 'express';
//# sourceMappingURL=index.d.ts.map