1) Przesyłanie plików
W przypadku używania składni tablicowej dla danych wejściowych plików indeks pliku jest ostatnim kluczem. $_FILES["file"]["name"]
na przykład jest tablicą nazw plików. Aby uzyskać informacje o i-tym pliku, musisz uzyskać dostęp do $_FILES["file"]["name"][$i]
, $_FILES["file"]["size"][$i]
&c.
2) Zapisywanie obrazów w folderze
Niektóre dane w $_FILES
(takie jak nazwa) pochodzi od klienta, a zatem nie można mu ufać (to znaczy najpierw zweryfikuj). W przypadku nazwy pliku
, możesz zacząć od użycia realpath
aby sprawdzić, czy ścieżka pliku docelowego jest bezpieczna, lub użyj basename
lub pathinfo
aby wyodrębnić ostatni komponent podanej nazwy przed złożeniem docelowej ścieżki.
3) Zapisywanie informacji o obrazie do bazy danych
Podany (niekompletny) schemat bazy danych wygląda tak, jakby każdemu obrazowi przypisano dwie kolumny w tej samej tabeli. W modelu relacyjnym relacje do wielu są modelowane za pomocą oddzielnej tabeli:
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;
W przeciwnym razie łamiesz zero-one-infinity reguła i marnowanie miejsca, gdy liczba obrazów jest mniejsza niż maksymalna.
Inne
Zwróć uwagę, że możesz użyć składni tablicowej dla pól opisu plików, aby ułatwić ich obsługę. Nazwij je "filedesc[]".
Zamiast długiej sekwencji porównań użyj wyszukiwania tablicy lub dopasowania wzorca.
Funkcjafunction 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)) {
Typ pliku jest jedną z tych wartości dostarczonych przez klienta. Bezpieczniej byłoby użyć fileinfo
aby uzyskać typ obrazu.
$finfo = finfo_open(FILEINFO_MIME_TYPE);
if (isImage(finfo_file($finfo, $path)) && ($_FILES["file"]["size"][$idx] < 1048600)) {
Nawet to można oszukać, jeśli plik ma prawidłowy nagłówek obrazu, ale reszta nie jest prawidłowa. Możesz użyć biblioteki obrazów (takich jak GD lub ImageMagick), aby zweryfikować plik, sprawdzając, czy możesz pomyślnie otworzyć plik jako obraz.