innoboxrr / s3-resumable-uploads
Resumable Uploads for Laravel & AWS S3
Requires
- aws/aws-sdk-php: ^3.337
Requires (Dev)
Suggests
None
Provides
None
Conflicts
None
Replaces
None
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?