harorudo/media-compressor

A Laravel utility for compressing images, PDFs, and files - powered by Intervention Image and Ghostscript

Maintainers

Package info

github.com/eddyharold/media-compressor

pkg:composer/harorudo/media-compressor

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-04-09 17:36 UTC

This package is auto-updated.

Last update: 2026-04-09 17:55:39 UTC


README

A Laravel utility for compressing images, PDFs, and files — powered by Intervention Image and Ghostscript.

Requirements

Installation

composer require harorudo/media-compressor

Laravel auto-discovers the service provider. No manual registration needed.

Install Ghostscript

Ubuntu / Debian:

sudo apt-get install ghostscript

macOS:

brew install ghostscript

Windows: Download from ghostscript.com/releases and ensure gswin64c.exe is in your PATH.

Configuration

Publish the config file:

php artisan vendor:publish --provider="Harorudo\MediaCompressor\CompressionServiceProvider"

config/compression.php:

return [
    'allowed_disks'  => ['public', 's3'],
    'max_file_size'  => 20 * 1024 * 1024, // 20 MB
];

Usage

Inject CompressionUtil directly or use the Compression facade.

Images

use Harorudo\MediaCompressor\Facades\Compression;

// Compress an uploaded image
$result = Compression::compressImage(
    file: $request->file('photo'),
    quality: 75,
    maxWidth: 1280,
    format: 'webp'         // 'original' | 'webp' | 'jpeg' | 'png'
);

// Compress multiple images
$results = Compression::compressImages($request->file('photos'));

// Re-compress an already stored image
$result = Compression::recompressStoredImage('images/avatar.jpg', quality: 60);

PDFs

// Compress an uploaded PDF
$result = Compression::compressPdf(
    file: $request->file('document'),
    preset: 'ebook'        // 'screen' | 'ebook' | 'printer' | 'prepress'
);

// Re-compress a stored PDF
$result = Compression::recompressStoredPdf('pdfs/report.pdf', preset: 'ebook');

// Bulk re-compress stored PDFs
$results = Compression::recompressStoredPdfs(['pdfs/a.pdf', 'pdfs/b.pdf']);

PDF presets

Preset Image DPI Best for
screen 72 Email attachments, smallest size
ebook 150 General use — recommended default
printer 300 High-quality downloads
prepress 300 + colour Print-ready, near-lossless

ZIP

// Zip a single uploaded file
$result = Compression::zipUploadedFile($request->file('document'));

// Zip multiple stored files into one archive
$result = Compression::zipFiles(
    storagePaths: ['docs/report.pdf', 'docs/invoice.pdf'],
    archiveName: 'reports'
);

Return value

Every method returns an array with savings stats:

[
    'path'            => 'pdfs/report.pdf',
    'original_size'   => 2048000,
    'compressed_size' => 819200,
    'saved_bytes'     => 1228800,
    'saved_percent'   => 60.0,
]

Security

This package enforces the following guards on every operation:

  • MIME type validation — server-side detection, client header is never trusted
  • File size limit — configurable via compression.max_file_size
  • Storage disk allowlist — configurable via compression.allowed_disks
  • Directory sanitization — strips invalid characters to prevent path traversal
  • Safe filenames — client filenames never touch the filesystem; hashed names are always used
  • Temp file cleanup — guaranteed via finally blocks, even on failure

License

MIT © Eddy Harold