1) Upload af filer
Når du bruger array-syntaks til filinput, er filindekset den sidste nøgle. $_FILES["file"]["name"]
er for eksempel en række filnavne. For at få oplysningerne om den i-te fil skal du have adgang til $_FILES["file"]["name"][$i]
, $_FILES["file"]["size"][$i]
&c.
2) Lagring af billeder i en mappe
Nogle af dataene i $_FILES
(såsom navnet) kommer fra klienten og er derfor ikke til at stole på (det vil sige verificere først). I tilfælde af filnavnet
, kan du starte med at bruge realpath
for at bekræfte, at målfilens stinavn er sikkert, eller brug basename
eller pathinfo
for at udtrække den sidste komponent af det angivne navn, før målstinavnet samles.
3) Gemmer billedoplysninger i DB
Det (ufuldstændige) databaseskema, du giver, ser ud til, at du giver hvert billede to kolonner i den samme tabel. Under den relationelle model modelleres to-mange relationer med en separat 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;
Ellers bryder du nul-én-uendeligheden regel og spild af plads, når der er færre end det maksimale antal billeder.
Andet
Bemærk, at du kan bruge array-syntaks til filbeskrivelsesfelterne for at gøre håndteringen nemmere. Navngiv dem "filedesc[]".
I stedet for en lang række af sammenligninger skal du bruge et matrixopslag eller et mønstermatch.
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)) {
Filtypen er en af disse klientleverede værdier. Sikrere ville være at bruge fileinfo
for at få billedtypen.
$finfo = finfo_open(FILEINFO_MIME_TYPE);
if (isImage(finfo_file($finfo, $path)) && ($_FILES["file"]["size"][$idx] < 1048600)) {
Selv det kan narre, hvis filen har en gyldig billedheader, men resten er ikke gyldig. Du kan bruge et billedbibliotek (såsom GD eller ImageMagick) for at validere filen ved at kontrollere, om du kan åbne filen som et billede.