goetas/multipart-upload-bundle
A Symfony bundle for handling chunked, multipart file uploads, letting you stream large files to Amazon S3 using its multipart upload API while integrating with OneupUploaderBundle for resumable, reliable uploads.
Architecture fit — poor for Laravel, good for Symfony.
Bundle class, DI compiler passes, and service definitions wired through Symfony's container — none of which Laravel's service-provider model consumes.symfony/http-foundation for the request/response layer and to oneup/uploader-bundle-style chunked-upload conventions. Laravel's Illuminate\Http\Request, FormRequest, and Storage facade have no interop with these.Integration feasibility — medium-to-low, with three viable paths.
Storage disk, replace Symfony events with Laravel events/facades. Most control, moderate effort.Technical risk — moderate-to-high, concentrated in the dependency itself.
Key questions to resolve before any commitment.
oneup/uploader-bundle, and if so, which protocol (Content-Range vs. proprietary chunk metadata)?OptionsResolver, EventDispatcher, Filesystem)?Stack fit. Target Laravel 11/12 on PHP 8.2+. The bundle's framework layer is incompatible; only the domain logic transfers. Keep framework-agnostic Symfony components (symfony/filesystem at most) if useful, drop the rest.
Migration path (recommended: port, don't install).
Uploads service or first-party package; lift the chunk-staging and assembly classes.Storage disk (uploads/tmp) so temp data is swappable between local and S3.auth + rate limiting: POST /uploads/{id}/chunks and POST /uploads/{id}/complete.UploadCompleted event; hand assembly to a queued job for anything above a size threshold.pion/laravel-chunk-upload or a Tus/Resumable.js client instead of reimplementing the wire protocol.Compatibility checks. Confirm PSR usage (PSR-7 vs. HttpFoundation) before porting — PSR-7-based code ports cleanly; HttpFoundation-based code needs a small adapter layer. Verify no reliance on Symfony DI tags or compiler passes, which have no Laravel equivalent and must be rewritten as container bindings.
Sequencing.
Steps 1 and 6 are the decision gates — if assembly is memory-bound or temp cleanup is absent, stop and re-plan around object-storage-native multipart.
Maintenance. Assume you become the maintainer. Once forked, upstream fixes are yours to backport; pin the commit, vendor the code, and record the provenance. Budget a small ongoing allocation rather than treating this as a set-and-forget Composer line.
Support. No vendor, no SLA, negligible community. Escalation path is "read the source." Acceptable for an internal utility, not for a customer-facing upload path without a named internal owner.
Scaling. Chunking trades payload size for request count — you will see many small requests and should plan rate limits, connection reuse, and idempotency on the chunk endpoint. Staging storage grows with concurrency × file size, so object storage is the right default. Assembly is IO/CPU-heavy and belongs on a worker pool, not the web tier. At meaningful scale, presigned-URL multipart upload to S3/GCS is materially cheaper to operate than server-side assembly and should be the baseline you compare against.
Failure modes to design for.
uploads:prune command.Ramp-up. One to two engineer-days to evaluate and spike; roughly one to two weeks to port, integrate, and harden to production quality. Engineers need to read Symfony bundle conventions (DI tags, compiler passes) to understand the source before translating it — a nontrivial context switch for a Laravel-only team.
TPM read. Low score and low opportunity are consistent with what this is: a narrow Symfony utility, single-maintainer, no adoption. For a Symfony shop already doing chunked uploads, it is a reasonable shortcut. For a Laravel shop, it is a reference design, not a dependency — and the honest comparison is against object-storage-native multipart upload, which likely wins on operations, scaling, and risk for the same integration effort.
How can I help you explore Laravel packages today?