El sistema permite la carga y gestión de imágenes para las publicaciones (posts). Las imágenes se almacenan en el servidor y se sirven a través de URLs públicas.
- Tamaño máximo de archivo: 10MB
- Tipos de archivo permitidos: Imágenes (image/*)
- Directorio de almacenamiento:
uploads/posts/YYYY/MM/ - URL base para acceder a las imágenes:
/uploads/posts/YYYY/MM/
uploads/
└── posts/
└── YYYY/
└── MM/
└── [nombre-archivo-unico].[extension]
POST /posts
Content-Type: multipart/form-data
Parámetros:
- contenido: string (requerido)
- creadorId: number (requerido)
- grupoId: number (opcional)
- imagen: file (opcional)
Respuesta exitosa (201 Created):
{
"id": number,
"contenido": string,
"fecha": string,
"img": string, // Ruta relativa de la imagen
"creador": {
"id": number,
"nombre": string
},
"grupo": {
"id": number,
"nombre": string
}
}PUT /posts/{id}
Content-Type: multipart/form-data
Parámetros:
- contenido: string (requerido)
- grupoId: number (opcional)
- imagen: file (opcional)
Respuesta exitosa (200 OK):
{
"id": number,
"contenido": string,
"fecha": string,
"img": string, // Ruta relativa de la imagen
"creador": {
"id": number,
"nombre": string
},
"grupo": {
"id": number,
"nombre": string
}
}// Crear un nuevo post con imagen
const formData = new FormData();
formData.append('contenido', 'Contenido del post');
formData.append('creadorId', 1);
formData.append('grupoId', 2);
formData.append('imagen', archivoImagen); // archivoImagen es un objeto File
fetch('/posts', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => console.log(data));
// Actualizar un post con nueva imagen
const formData = new FormData();
formData.append('contenido', 'Contenido actualizado');
formData.append('imagen', nuevaImagen);
fetch('/posts/1', {
method: 'PUT',
body: formData
})
.then(response => response.json())
.then(data => console.log(data));<form id="postForm">
<textarea name="contenido" required></textarea>
<input type="file" name="imagen" accept="image/*">
<button type="submit">Publicar</button>
</form>
<script>
document.getElementById('postForm').onsubmit = async (e) => {
e.preventDefault();
const formData = new FormData(e.target);
formData.append('creadorId', 1); // ID del usuario actual
const response = await fetch('/posts', {
method: 'POST',
body: formData
});
const data = await response.json();
console.log(data);
};
</script>400 Bad Request:- Archivo vacío
- Tipo de archivo no permitido
- Tamaño de archivo excede el límite
404 Not Found:- Usuario o grupo no encontrado
500 Internal Server Error:- Error al procesar la imagen
- Error al guardar el archivo
{
"error": "Solo se permiten archivos de imagen"
}- Se validan los tipos MIME de los archivos
- Se generan nombres únicos para evitar colisiones
- Se organizan los archivos por año/mes para mejor gestión
- Se eliminan las imágenes antiguas al actualizar o eliminar posts
- Comprimir las imágenes antes de subirlas
- Usar formatos web optimizados (JPEG, PNG, WebP)
- Implementar validación de tamaño en el frontend
- Mostrar previsualización de la imagen antes de subir
- Manejar errores y mostrar mensajes al usuario