sql >> Database >  >> RDS >> Mysql

PHP gebruiken om afbeeldingen naar een map te uploaden terwijl beschrijvingen in een database worden opgeslagen

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.



  1. Breng uw eigen cloud beschikbaar voor DigitalOcean

  2. Wat is de meest efficiënte manier om de laatste n rijen in een tabel te selecteren zonder de structuur van de tabel te wijzigen?

  3. Hoe maak ik een Cron-taak aan om MySQL en FTP-back-up te back-uppen naar mijn back-upserver?

  4. Hoe een enkele rij te selecteren a 100 miljoen x