1) Subir archivos
Cuando se utiliza la sintaxis de matriz para las entradas de archivos, el índice del archivo es la última clave. $_FILES["file"]["name"]
, por ejemplo, es una matriz de nombres de archivos. Para obtener la información del i-ésimo archivo, deberá acceder a $_FILES["file"]["name"][$i]
, $_FILES["file"]["size"][$i]
&c.
2) Guardar imágenes en una carpeta
Algunos de los datos en $_FILES
(como el nombre) proviene del cliente y, por lo tanto, no es de confianza (es decir, verifique primero). En el caso del nombre de archivo
, puede comenzar usando realpath
para verificar que la ruta del archivo de destino sea segura, o use basename
o pathinfo
para extraer el último componente del nombre proporcionado antes de ensamblar el nombre de la ruta de destino.
3) Guardando la información de la imagen en la base de datos
El esquema de base de datos (incompleto) que proporciona parece que le da a cada imagen dos columnas en la misma tabla. Bajo el modelo relacional, las relaciones a muchos se modelan con una tabla separada:
CREATE TABLE images (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
`path` VARCHAR(256) NOT NULL,
`description` TEXT,
`member` INT UNSIGNED NOT NULL,
FOREIGN KEY `member` REFERENCES members (`id`) ON DELETE CASCADE ON UPDATE CASCADE -- the image's owner
) Engine=InnoDB;
-- Note: this is a many-to-many relationship
CREATE TABLE ad_images (
`ad` INT UNSIGNED NOT NULL,
`image` INT UNSIGNED NOT NULL,
FOREIGN KEY `ad` REFERENCES ads (`ad_id`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY `image` REFERENCES images (id) ON DELETE CASCADE ON UPDATE CASCADE,
UNIQUE KEY (`ad`, `image`)
) Engine=InnoDB;
De lo contrario, estás rompiendo el zero-one-infinity regla y desperdiciar espacio cuando hay menos del número máximo de imágenes.
Otro
Tenga en cuenta que puede usar la sintaxis de matriz para los campos de descripción del archivo para facilitar su manejo. Nómbralos "filedesc[]".
En lugar de una larga secuencia de comparaciones, utilice una búsqueda de matrices o una coincidencia de patrones.
function isImage($type) {
static $imageTypes = array(
'image/gif'=>1, 'image/jpeg'=>1, 'image/pjpeg'=>1, 'image/png'=>1,
);
return isset($imageTypes[$type]);
/* OR */
return preg_match('%^image/(?:p?jpeg|gif|png)%', $type);
/* OR allow all images */
return preg_match('%^image/%', $type);
}
if (isImage($_FILES["file"]["type"][$idx]) && ($_FILES["file"]["size"][$idx] < 1048600)) {
El tipo de archivo es uno de esos valores proporcionados por el cliente. Más seguro sería usar fileinfo
para obtener el tipo de imagen.
$finfo = finfo_open(FILEINFO_MIME_TYPE);
if (isImage(finfo_file($finfo, $path)) && ($_FILES["file"]["size"][$idx] < 1048600)) {
Incluso eso puede ser engañado si el archivo tiene un encabezado de imagen válido pero el resto no es válido. Puede usar una biblioteca de imágenes (como GD o ImageMagick) para validar el archivo comprobando si puede abrir correctamente el archivo como una imagen.