Autor Zpráva
ondra.prenek
Profil
Ahoj, dělám na webu vkládání příspěvků přes php/mysql (nepoužívám wordpress) a potřeboval bych vědět, jak udělat, aby návštěvník mého webu mohl vložit obrázky. Jde to udělat taky přes databázi nebo by ste to udělali jinak?
Díky
Taps
Profil
ondra.prenek:
optimální je takové záležitosti dělat přes databázi, do které můžeš např. uložit název obrázku a jeho velikost

1) musíš mít na webu formulář, pomocí kterého návštěvník obrázek nahraje
2) pomocí php provedeš upload obrázku a informace uložíš do databáze
3) vhodné je provádět validaci vkládaného souboru
ondra.prenek
Profil
jak by to mělo vypadat? Díky moc
Tomáš123
Profil
ondra.prenek:
1) musíš mít na webu formulář, pomocí kterého návštěvník obrázek nahraje
Na webe, kde chceš umožniť užívateľom pridávať obrázky zriadiš stránku s formulárom.

2) pomocí php provedeš upload obrázku a informace uložíš do databáze
Vyplnené polia formuláru odošleš na skript (uvedený v značke <form> pod atribútom action), overíš, či je obrázok v správnom formáte, či má požadovanú veľkosť atď. a uložíš potrené informácie do databázy a samotný obrázok do nejakého adresára.

jak by to mělo vypadat?
Ak myslíš skript, tak by bolo lepšie najprv preukázať snahu a skúsiť niečo vytvoriť. Aj keď nebude skript fungovať, aspoň ti budú môcť ostatní radiť „na mieru“.
Marschmallow
Profil
ondra.prenek:
Tady máš jednoduchý skript, který ti přiložený obrázek uloží do složky obrazky:
<form method="post" enctype="multipart/form-data">
    <input type="file" name="obrazky[]" />
    <input type="submit" value="Nahrát na server!" />
</form>

<?php
 
// konfigurace
$uploadDir = 'obrazky'; // adresar, kam se maji nahrat obrazky (bez lomitka na konci)
$allowedExt = array('jpg', 'jpeg', 'png', 'gif'); // pole s povolenymi priponami
 
// zpracovani uploadu
if(isset($_FILES['obrazky']) && is_array($_FILES['obrazky']['name'])) {
 
    $counter = 0;
    $allowedExt = array_flip($allowedExt);
    foreach($_FILES['obrazky']['name'] as $klic => $nazev) { // zde poslané obrázky proměníme na proměnnou $nazev
        
        $nazev = htmlspecialchars($nazev, ENT_QUOTES);
        $fileName = basename(time() . ".png");
        $fileName = sprintf(time() . ".png", pathinfo($nazev, PATHINFO_EXTENSION));
        $tmpName = $_FILES['obrazky']['tmp_name'][$klic];
        $fileName = htmlspecialchars($fileName, ENT_QUOTES);
        
 
        // kontrola souboru
        if(
            !is_uploaded_file($tmpName)
            || !isset($allowedExt[strtolower(pathinfo($fileName, PATHINFO_EXTENSION))])
        ) {
            // neplatny soubor nebo pripona
            continue;
        }
 
        // presun souboru
        if(move_uploaded_file($tmpName, "{$uploadDir}".DIRECTORY_SEPARATOR."{$fileName}")) {
            ++$counter;
        }
 
    }
 
    if ($counter > 0)
    echo "<hr><p>Úspěšně byl nahrán {$counter} z ".sizeof($_FILES['obrazky']['name'])." obrázků, děkujeme!<br>
    <br>
    <b>Odkazy na obrázek</b>:<br>
    Klikatelný odkaz na obrázek:<br> 
    <a href='http://web.cz/$uploadDir/$fileName'  target='_blank'>http://web.cz/$uploadDir/$fileName</a><br>
    
    Kopírovatelný odkaz na obrázek:<br> 
    <input type='text' name='f1' id='url' size='100%' value='http://web.cz/$uploadDir/$fileName' onclick='this.select(); PS.clickUrl();'><br>
    </p>"."<br>";
    else
    echo "<hr><b><font color='red'>CHYBA: Nenahráli jste žádný obrázek, nebo má obrázek špatnou příponu!</font></b><br>"; 
}
 
?>

A teď, co je v jednotlivých proměnných (tyto proměnné jsou znázorněny v kódu):
$uploadDir = relativně umístěná složka, do které se mají obrázky uložit (bez lomítka na konci)
$allowedExt = povolené přípony obrázku, ostatní nebudou nahrány
$nazev = nezpracovaný název souboru (tak jak jej má uživatel ve svém PC)
$fileName = koncový název souboru, se kterým můžeš dále pracovat

Proměnná $fileName se pro jistotu na řádku 23 ještě kontroluje pomocí htmlspecialchars, to aby se nemohl provést nebezpečný XSS útok (více zde). Proměnnou $nazev také raději kontroluji - ř. 19 (ačkoliv to není nutné).

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: