Autor Zpráva
Marschmallow
Profil
Dobrý den,
včera jsem se ptal na výpis souborů pomocí PHP s odkazem. Soubory do té složky vypisuje skript, na který se Vás chci zeptat. Když nahraji soubor obrazek.jpg, normálně vše proběhne a soubor se nahraje. Když poté nahraji jiný soubor se stejným názvem obrazek.jpg, nový obrázek se nahraje a starý se odstraní (přepíše na nový). A to já nechci. Když by se nahrál třeba druhý obrázek jménem obrazek.jpg, tak aby se nahrál přepsaný jako obrazek1.jpg (tedy pokud už na serveru je nahraný obrazek.jpg). Můj kód:
<?php
 
// konfigurace
$uploadDir = './soubory'; // 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) {
 
        $fileName = basename($nazev);
        $tmpName = $_FILES['obrazky']['tmp_name'][$klic];
 
        // 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;
        }
 
    }
 
    echo "<p>Bylo nahráno {$counter} z ".sizeof($_FILES['obrazky']['name'])." obrázků.</p>";
 
}
 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=windows-1250"
 http-equiv="content-type">
  <title></title>
</head>
<body>
<h2><u>Uploadni soubor na web!</u></h2>
<form method="post" enctype="multipart/form-data">
    <input type="file" name="obrazky[]" multiple="multiple" />
    <input type="submit" value="Nahrát" /><br>
<br>
<br>
Nahrajte soubor a kliknutím <a href="obsah.php">sem</a> zobrazíte všechny nahrané soubory, včetně toho vašeho.
</body>
</html>
Jak tedy mohu docílit, aby se za duplicitní názvy přidávali třeba čísla (2, 3, 4...)?
Děkuji :)
Taps
Profil
Marschmallow:
pomocí funkce
<?
file_exists();
?>
otestuj zda takový soubor, již na serveru existuje, pokud existovat bude tak např. přidej značku time
<?
$fileName = time().'̈́-'.basename($nazev);
?>
Marschmallow
Profil
Taps:
Díky, ale nefunguje mi to, nebo spíš nevím kam (na jaké místo) to napsat.

EDIT: Funguje to, ale zakáže to tam nahrávat stejný název souboru, takže se ani nenahraje, ani nepřepíše.
tatyalien
Profil
Dej si kontrolu názvu do cyklu while a až narazíš na název, který neexistuje, tak teprve pak přesuň soubor.

Já používám například:

                // dělám v Nette, takže getSanitizedName() ti asi nebude fungovat, ale dosaď si získaný prvotní název obrázku
                // $uploadFolder = cesta kam ukládáš soubory
                $name = $data['obrazek']->getSanitizedName();
                $isExisting = @fopen($uploadFolder.$name,"r");
                while($isExisting) {
                    $name = rand(0, 9).$name;
                    $isExisting = @fopen($uploadFolder.$name,"r");
                }
                $data['obrazek']->move($uploadFolder.$name);
Jan Tvrdík
Profil
tatyalien:
Což lze zjednodušit na:

$name = $data['obrazek']->getSanitizedName();
while (file_exists($uploadFolder . $name)) {
    $name = rand(0, 9) . $name;
}
$data['obrazek']->move($uploadFolder . $name);
tatyalien
Profil
Jan Tvrdík:
jop... taky pravda ;)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0