sql >> Databasteknik >  >> RDS >> Mysql

Använder PHP för att ladda upp bilder till en mapp samtidigt som beskrivningar sparas i en databas

1) Ladda upp filer

När du använder arraysyntax för filinmatning är filindex den sista nyckeln. $_FILES["file"]["name"] , till exempel, är en rad filnamn. För att få information om den i-te filen måste du komma åt $_FILES["file"]["name"][$i] , $_FILES["file"]["size"][$i] &c.

2) Spara bilder i en mapp

En del av data i $_FILES (som namnet) kommer från klienten och är därför inte att lita på (det vill säga verifiera först). När det gäller filnamnet , kan du börja med att använda realpath för att verifiera att målfilens sökväg är säker, eller använd basename eller pathinfo för att extrahera den sista komponenten i det angivna namnet innan du sätter ihop målsökvägsnamnet.

3) Sparar bildinformation i DB

Det (ofullständiga) databasschemat du ger ser ut som att du ger varje bild två kolumner i samma tabell. Under relationsmodellen modelleras till-många-relationer med en separat tabell:

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;

Annars bryter du mot noll-ett-oändligheten regel och slöseri med utrymme när det finns färre än det maximala antalet bilder.

Övrigt

Observera att du kan använda arraysyntax för filbeskrivningsfälten för att göra hanteringen enklare. Döp dem till "filedesc[]".

Istället för en lång sekvens av jämförelser, använd en arraysökning eller en mönstermatchning.

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 är ett av de klientlevererade värdena. Säkrare skulle vara att använda fileinfo för att få bildtypen.

$finfo = finfo_open(FILEINFO_MIME_TYPE);

if (isImage(finfo_file($finfo, $path)) && ($_FILES["file"]["size"][$idx] < 1048600)) {

Även det kan luras om filen har ett giltigt bildhuvud men resten inte är giltigt. Du kan använda ett bildbibliotek (som GD eller ImageMagick) för att validera filen genom att kontrollera om du lyckas öppna filen som en bild.



  1. Dataåtkomst från Raspberry Pi

  2. Hur kör man SQLite-fråga asynkront på bakgrundstråden?

  3. Hur kan jag påskynda databasprocessen?

  4. fel när du infogar i tabellen med istället för trigger från entitetsdataramverket