innoboxrr / s3-resumable-uploads
Resumable Uploads for Laravel & AWS S3
Installs: 63
Dependents: 1
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/innoboxrr/s3-resumable-uploads
Requires
- aws/aws-sdk-php: ^3.337
Requires (Dev)
README
Este paquete permite gestionar cargas de archivos grandes en múltiples partes (multipart uploads) hacia Amazon S3, utilizando rutas prefirmadas, protección CSRF y un flujo controlado desde Laravel.
✨ Características
- Compatible con cualquier frontend (Vue, React, JS puro, etc.)
- Firmado de partes individualmente para mayor seguridad
- Soporte para reintentos y cargas pausadas
- Integración con AWS S3 (vía SDK oficial)
📂 Endpoints disponibles
El sistema se compone de 3 requests principales:
1. Iniciar carga (InitiateUploadRequest)
Método: POST
Ruta sugerida: /api/upload/initiate
Body:
{
    "filename": "mi_archivo.pdf",
    "file_identifier": "unico-uuid-o-hash"
}
Respuesta:
{
    "upload_id": "ABC123XYZ..."
}
2. Firmar parte (SignPartUploadRequest)
Método: POST
Ruta sugerida: /api/upload/sign-part
Body:
{
    "file_identifier": "unico-uuid-o-hash",
    "upload_id": "ABC123XYZ...",
    "part_number": 1
}
Respuesta:
{
    "url": "https://s3.amazonaws.com/tu-bucket/..."
}
Este url es donde el frontend sube la parte directamente vía PUT.
3. Completar carga (CompleteUploadRequest)
Método: POST
Ruta sugerida: /api/upload/complete
Body:
{
    "filename": "mi_archivo.pdf",
    "file_identifier": "unico-uuid-o-hash",
    "upload_id": "ABC123XYZ...",
    "parts": [
        {
            "ETag": "\"etag-de-la-parte\"",
            "PartNumber": 1
        },
        ...
    ]
}
Respuesta:
{
    "message": "Upload completed",
    "url": "https://s3.amazonaws.com/tu-bucket/uploads/unico-uuid-o-hash/mi_archivo.pdf"
}
🧩 Cómo funciona internamente
CustomFormRequest
- Prepara y valida los datos comunes: filename,file_identifier, y construye dinámicamente la clave (Key) donde se almacenará el archivo en S3.
- Usa los traits S3Clientpara instanciar el cliente AWS y obtener el bucket configurado.
getKey()
Construye el path completo del archivo en S3:
/uploads/{file_identifier}/{filename}
Este path puede ser configurado usando:
// config/s3resumableuploads.php return [ 'file_path' => 'uploads' ];
⚙️ Requisitos
- Laravel 8+
- AWS SDK configurado (config/filesystems.php)
- Credenciales válidas con permisos de s3:PutObject,s3:AbortMultipartUpload,s3:CompleteMultipartUpload, etc.
🛠️ Instalación
composer require innoboxrr/s3-resumable-uploads
Agrega tus rutas:
Route::post('/api/upload/initiate', InitiateUploadRequest::class); Route::post('/api/upload/sign-part', SignPartUploadRequest::class); Route::post('/api/upload/complete', CompleteUploadRequest::class);
🔐 Seguridad
- Todas las rutas esperan un token CSRF (_token)
- Se recomienda validar autorización en cada authorize()de los FormRequest según lógica propia del proyecto
📦 Estructura del paquete
Innoboxrr/
├── S3ResumableUploads/
│   ├── Http/
│   │   └── Requests/
│   │       └── S3Multipart/
│   │           ├── InitiateUploadRequest.php
│   │           ├── SignPartUploadRequest.php
│   │           ├── CompleteUploadRequest.php
│   └── Support/
│       └── Traits/
│           └── S3Client.php
¿Quieres que te genere también el archivo config/s3resumableuploads.php o los traits S3Client/s3Bucket() si aún no están definidos?