1. Go to this page and download the library: Download resumable/chunked-uploader library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
resumable / chunked-uploader example snippets
declare(strict_types=1);
use Resumable\ChunkedUploader\Core\Assembler\StreamAssembler;
use Resumable\ChunkedUploader\Core\Drivers\Metadata\RedisMetadataRepository;
use Resumable\ChunkedUploader\Core\Drivers\Storage\LocalChunkStorage;
use Resumable\ChunkedUploader\Core\Models\Chunk;
use Resumable\ChunkedUploader\Core\Security\PathSanitizer;
use Resumable\ChunkedUploader\Core\Security\UploadTokenService;
use Resumable\ChunkedUploader\Core\ChunkUploader;
use Resumable\ChunkedUploader\Core\Validation\ChunkSecurityValidator;
use Resumable\ChunkedUploader\Core\Validation\ValidationPipeline;
use Resumable\ChunkedUploader\Core\Contracts\EventDispatcherInterface;
use Resumable\ChunkedUploader\Core\Contracts\FileAssemblerInterface;
use Resumable\ChunkedUploader\Core\Contracts\ProgressTrackerInterface;
use Resumable\ChunkedUploader\Core\Contracts\ChunkValidatorInterface;
use Resumable\ChunkedUploader\Core\Contracts\ChunkStorageInterface;
use Resumable\ChunkedUploader\Core\Contracts\MetadataRepositoryInterface;
use Resumable\ChunkedUploader\Core\Exceptions\ChunkUploaderException;
// 1. Wire the infrastructure.
$storage = new LocalChunkStorage('/var/lib/my-app/chunks', new PathSanitizer());
$metadata = new RedisMetadataRepository(new \Redis(['host' => '127.0.0.1']));
$assembler = new StreamAssembler('/var/lib/my-app/final');
$validator = new ChunkSecurityValidator(
sanitizer: new PathSanitizer(),
pipeline: new ValidationPipeline([]),
tokenService: new UploadTokenService($_ENV['UPLOAD_TOKEN_SECRET']),
);
// 2. Create the manager once, inject it into your request handler.
$manager = new ChunkUploader(
storage: $storage,
metadata: $metadata,
progress: $metadata,
assembler: $assembler,
validator: $validator,
dispatcher: new class implements EventDispatcherInterface {
public function dispatch(object $event): object { return $event; }
},
);
// 3. Issue a token bound to the upload signature and client context.
$token = (new UploadTokenService($_ENV['UPLOAD_TOKEN_SECRET']))
->createToken('upload_123', 4, 20_000_000, 'client-context');
// 4. For each incoming chunk, build a Chunk DTO and process it.
try {
$state = $manager->processChunk(new Chunk(
identifier: 'upload_123',
token: $token,
index: 0,
totalChunks: 4,
chunkSize: filesize($tempFile), // actual byte size of this chunk
totalSize: 20_000_000, // expected total size
tmpFilePath: $tempFile, // from PHP's upload temp dir
originalFilename: 'archive.zip',
));
} catch (ChunkUploaderException $e) {
// validation / storage / assembly failure
}
// The manager returns the latest upload state; when isCompleted is true the
// final file has been assembled and temp chunks deleted.
if ($state->isCompleted) {
// finalPath points to the assembled artifact
echo $state->finalPath;
}
use Resumable\ChunkedUploader\Core\Attributes\ChunkedUpload;
use Resumable\ChunkedUploader\Core\Attributes\AllowedMimes;
use Resumable\ChunkedUploader\Core\Attributes\MaxFileSize;
final class MediaController
{
#[ChunkedUpload(tokenSalt: 'media-endpoint')]
#[AllowedMimes(['video/mp4'])]
#[MaxFileSize(50 * 1024 * 1024)]
public function upload(): void
{
// Resolve the method with ChunkedUploadConfigResolver in the bridge,
// then pass the returned UploaderConfig to ChunkUploader::processChunk.
}
}