1) Bestanden uploaden
Bij gebruik van array-syntaxis voor bestandsinvoer, is de bestandsindex de laatste sleutel. $_FILES["file"]["name"]
, is bijvoorbeeld een array van bestandsnamen. Om de informatie voor het i-th bestand te krijgen, moet je toegang krijgen tot $_FILES["file"]["name"][$i]
, $_FILES["file"]["size"][$i]
&c.
2) Afbeeldingen opslaan in een map
Enkele gegevens in $_FILES
(zoals de naam) komt van de client en is dus niet te vertrouwen (dat wil zeggen, eerst verifiëren). In het geval van de bestandsnaam
, kunt u beginnen met realpath
om te controleren of de padnaam van het doelbestand veilig is, of gebruik basename
of pathinfo
om het laatste onderdeel van de opgegeven naam te extraheren voordat de doelpadnaam wordt samengesteld.
3) Beeldinformatie opslaan in DB
Het (onvolledige) databaseschema dat u geeft, ziet eruit alsof u elke afbeelding twee kolommen in dezelfde tabel geeft. Onder het relationele model worden tot-veel relaties gemodelleerd met een aparte tabel:
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;
Anders verbreek je de zero-one-infinity regel en verspilt ruimte wanneer er minder dan het maximale aantal afbeeldingen zijn.
Overig
Merk op dat u arraysyntaxis kunt gebruiken voor de velden met bestandsbeschrijvingen om de verwerking ervan te vergemakkelijken. Noem ze "filedesc[]".
Gebruik in plaats van een lange reeks vergelijkingen een array-lookup of een patroonovereenkomst.
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)) {
Het bestandstype is een van die door de klant geleverde waarden. Veiliger zou zijn om fileinfo
te gebruiken
om het afbeeldingstype te krijgen.
$finfo = finfo_open(FILEINFO_MIME_TYPE);
if (isImage(finfo_file($finfo, $path)) && ($_FILES["file"]["size"][$idx] < 1048600)) {
Zelfs dat kan voor de gek gehouden worden als het bestand een geldige afbeeldingsheader heeft, maar de rest niet geldig is. U kunt een afbeeldingsbibliotheek gebruiken (zoals GD of ImageMagick) om het bestand te valideren door te controleren of u het bestand als afbeelding kunt openen.