1) Качване на файлове
Когато използвате синтаксис на масив за въвеждане на файлове, индексът на файла е последният ключ. $_FILES["file"]["name"]
, например, е масив от имена на файлове. За да получите информацията за i-тия файл, ще трябва да получите достъп до $_FILES["file"]["name"][$i]
, $_FILES["file"]["size"][$i]
и др.
2) Записване на изображения в папка
Някои от данните в $_FILES
(като името) идва от клиента и следователно не му се вярва (тоест първо проверете). В случай на име на файла
, можете да започнете с помощта на realpath
за да проверите дали пътят на целевия файл е безопасен или използвайте basename
или pathinfo
за да извлечете последния компонент на предоставеното име, преди да сглобите целевото име на пътя.
3) Запазване на информация за изображението в DB
(Непълната) схема на базата данни, която давате, изглежда, че давате на всяко изображение две колони в една и съща таблица. При релационния модел релациите към много се моделират с отделна таблица:
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;
В противен случай нарушавате zero-one-infinity правило и губене на място, когато има по-малко от максималния брой изображения.
Друго
Имайте предвид, че можете да използвате синтаксис на масив за полетата за описание на файла, за да улесните работата с тях. Наименувайте ги "filedesc[]".
Вместо дълга поредица от сравнения, използвайте търсене в масив или съвпадение на шаблон.
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)) {
Типът на файла е една от тези стойности, предоставени от клиента. По-безопасно би било да използвате fileinfo
за да получите типа на изображението.
$finfo = finfo_open(FILEINFO_MIME_TYPE);
if (isImage(finfo_file($finfo, $path)) && ($_FILES["file"]["size"][$idx] < 1048600)) {
Дори това може да се заблуди, ако файлът има валиден заглавка на изображението, но останалото не е валидно. Можете да използвате библиотека с изображения (като GD или ImageMagick), за да потвърдите файла, като проверите дали можете успешно да отворите файла като изображение.