qcod/laravel-imageup
Laravel ImageUp is a trait that adds automatic image upload, resizing, and cropping to Eloquent models with extensive customization. Just mark image fields on your model and it handles uploads, stores paths, and deletes old images automatically.
Model::saved() and reads from the request automatically, it is well suited to back-office CRUD, staff tooling, and low-traffic internal panels where a conventional form post is the whole interaction model. It is a poor fit for anything with a designed upload UX (progress, drag-and-drop, client-side crop with server-side coordinates is the one supported exception via cropTo()).Adopt when most of these hold:
public or S3) with public-read semantics is acceptable; signed/private URLs are not a requirement.$image->blur(), $image->resize()), or you have verified a v3-compatible fork/pin.Look elsewhere when any of these are true:
spatie/laravel-medialibrary or a dedicated media model.request() helper and fires on model save, which pushes you toward HTTP-level tests and makes domain logic harder to isolate. If your team enforces fast unit-test suites, this coupling is a real tax.rules string, and the documented filename-override example interpolates $file->getClientOriginalName() straight into a storage path — user-controlled input reaching a filesystem path. Verify defaults, add explicit image|mimes|max rules on every field, and prefer the default hashed filenames.For executives (one paragraph): Image upload is table stakes and undifferentiated — every product needs avatars and covers, and none of them win customers on how they store a JPEG. This package lets us deliver that capability in days instead of a sprint, at zero licensing cost, with no vendor lock-in and no new infrastructure. It is deliberately scoped to single images per record, which covers the large majority of our near-term needs. The trade-off we are accepting is a small maintenance dependency and a modest ceiling: when media becomes a genuine product differentiator — galleries, transformations, CDN delivery — we will graduate to a purpose-built media layer, and that migration is contained because the package's surface is a trait plus a config array rather than a proprietary schema.
For engineering (the ask): Add HasImageUploads to the relevant models, declare $imageFields with explicit rules on every field, pin Intervention Image to a compatible major, and keep uploads out of any latency-sensitive path. Two deliberate guardrails: (1) do not use the getClientOriginalName() filename pattern in the docs — the default hash is safer; (2) set auto_upload => false anywhere we need explicit control, and prefer uploadImage() calls so behavior is visible at the call site rather than implied by a saved() hook. We should also decide, and document, what happens to stored images on model deletion — the package does not handle it, and we own that gap.
Decision recommendation: Adopt now for internal tools and non-critical profile surfaces. Do not adopt for anything in the customer-facing content pipeline or anything behind a strict security/compliance review until the validation defaults and path handling have been reviewed. Revisit if the roadmap adds multi-image or transformation requirements.
How can I help you explore Laravel packages today?