« 1 2 »
Autor Zpráva
rotorod
Profil *
dobrý den
chtěl bych v administraci mít možnost nahravat obrazky a pdfka do složky files na ftp. Vložil jsem tento script, otevřu stránku, vyberu obrázek dam nahrát ale píše warning řádek 27
nevíte kde je problém proč mi to nenahraje?
děkuji za pomoc

<?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) {
 
        $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>";
 
}
 
?>
<form method="post" enctype="multipart/form-data">
    <input type="file" name="obrazky[]" multiple="multiple" />
    <input type="submit" value="Nahrát" />
</form>



EDIT: tak už vyřešeno
v 4 řádku před ./obrazky mají byt 2 tečky :-)
rotorod
Profil *
dobrý den
přesto se zeptám. Nahravání funguje. jaky script bych měl napsat abych viděl v administraci (tam kde je to nahravání) v nějakém seznamu či tabulce to co je již nahrané v té dané složce?
děkuji za rady


a ještě jednu prosím doplňku:
co do stavajiciho scriptu je třeba dopsat aby to hlídalo a nenahrálo obrázek se stejným názvem? protože teď to přepisuje.
díky
RastyAmateur
Profil
rotorod:
abych viděl v administraci (tam kde je to nahravání) v nějakém seznamu či tabulce to co je již nahrané v té dané složce?
Tak pokud to máš v nějaké speciální složce, je to lehké. Prostě napíšeš script, který ti vypíše obsah složky. K tomu bych použil funkci scandir(). Vrací pole, takže je to super. Pokud je chceš vypsat, uděláš si jen podmínku v cyklu, že se nesmí rovnat "." (aktuální adresář) a ".." (předchozí adresář). No a máš všechny obrázky v poli. Poté, když budeš chtít vědět, jestli už takový obrázek náhodou neexistuje, tak můžeš použít například funkci in_array().

Pokud to nemáš v nějaké speciální složce, tak mě teď napadá to maximálně prohnat podmínkou, která bude zkoumat koncovku souboru.
rotorod
Profil *
RastyAmateur:
a mohl bych Vás (Tě) poprosit o sepsání takového scriptu? jak by to mělo asi vypadat? ten script nahoře na to nahravani mám v samotném souboru "spravce.php" a to je ve složce "admin"
děkuji za pomoc
RastyAmateur
Profil
<?php
  # Výpis všech obrázků
  $images = scandir("obrazky");
  echo "<ul>";
  foreach($images as $img){
    if($img !== "." and $img !== "..") echo "<li><a href=\"obrazky/".$img."\">".$img."</a></li>";
    }
  echo "</ul>";
  
  # Kontrola, jestli už byl nahrán
  if(file_exists("obrazky/".$_FILES["obrazky"]["name"])){
    die("Obrázek již byl nahrán!");# Obrázek již byl nahrán!    
    }
  else{
    # Pokračovat v nahrávání
    }
?>
Výpis jsem testoval, funguje, tu kontrolu ne. Sice je to jiná kontrola, než jsem psal, ale to asi nevadí, zkrátí to zápis a asi se i vykoná rychleji. Nevím, proč mě to předtím nenapadlo.

Btw: Můžete vykat, můžeš tykat, nemusíš obojí...
rotorod
Profil *
RastyAmateur:
děkuji, takže to mám přidat k tomu předešlému scriptu do jednoho souboru? takže celkový script v souboru spravce.php bude vypadat takto? asi mám něco špatně ale nevím co. děkuji za radu

<div id="obsah">
    <form method="post" enctype="multipart/form-data">
        <h2>Správce souborů</h2>
        <br>
<?php
 
// konfigurace
$uploadDir = '../obrazky'; // adresar, kam se maji nahrat obrazky (bez lomitka na konci)
$allowedExt = array('jpg', 'jpeg', 'png', 'gif', 'pdf'); // 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>";
 
}
 
 # Výpis všech obrázků
  $images = scandir("obrazky");
  echo "<ul>";
  foreach($images as $img){
    if($img !== "." and $img !== "..") echo "<li><a href=\"obrazky/".$img."\">".$img."</a></li>";
    }
  echo "</ul>";
  
  # Kontrola, jestli už byl nahrán
  if(file_exists("obrazky/".$_FILES["obrazky"]["name"])){
    die("Obrázek již byl nahrán!");# Obrázek již byl nahrán!    
    }
  else{
    # Pokračovat v nahrávání
    }
 
 
?>


  



<form method="post" enctype="multipart/form-data">
    <input type="file" name="obrazky[]" multiple="multiple" />
    <input type="submit" value="Nahrát" />
</form>

</form>
    
</div>
RastyAmateur
Profil
Ten script vůbec nedává smysl. Až budu na pc, pokusím se ho opravit. Dej mi hodinku.


<!doctype html>
  <head>
    <meta charset="utf-8">
    <title>Administrace - fotoUpload</title>
    <style>
      ul li a{
        text-decoration: none;
        font-weight: bold;
        color: blue;
        }
      ul li a:hover{
        text-decoration: underline;
        }
    </style>
  </head>
  <body>
    <?php
      $uploadDir = 'obrazky'; 
      $allowedExt = array('jpg', 'jpeg', 'png', 'gif');
      if(!empty($_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];
          if(file_exists($uploadDir."/".$_FILES['obrazky']['name'][$klic]) || !isset($allowedExt[strtolower(pathinfo($fileName, PATHINFO_EXTENSION))])){
            continue;
            }
          if(move_uploaded_file($tmpName, "{$uploadDir}".DIRECTORY_SEPARATOR."{$fileName}")) {
            ++$counter;
            }
          } 
        echo "<p>Bylo nahráno {$counter} z ".sizeof($_FILES['obrazky']['name'])." obrázků.</p>"; 
        } 
    ?>
    <form method="post" enctype="multipart/form-data">
      <input type="file" name="obrazky[]" multiple="multiple" />
      <input type="submit" value="Nahrát" />
    </form>
    <ul>
      <?php
        $images = scandir($uploadDir);      
        foreach($images as $img){
          if($img !== "." and $img !== "..") echo "<li><a href=\"obrazky/".$img."\">".$img."</a></li>";
          }  
      ?>
    </ul>
  </body>
</html>
Vše mi fungovalo, jak má, jen byl menší problém s kódováním, nevím proč. Snad si s tím poradíš...

Nezapomeň si upravit $uploadDir (line 18)
rotorod
Profil *
ok teraz super, jen jestli ještě mohu:
- po najeti se to jevi jako odkaz. jak to zrušit?
- když nahraju obrazek se stejnym nazvem tak to nepřepiše


kodovani je OK u mě


a jde to dat nějak do 2 nebo 3 sloupcu ten seznam?
RastyAmateur
Profil
odkaz - Je to odkaz. Lze ho odmazat ve foreach() uplně dole. (odmazat to <a href...> a ještě </a>)

seznam - Ano šlo. Ale bylo by to zbytečně komplikované... Opravdu je to nutné?

přepis - Myslel jsem, že to byl účel...
RastyAmateur
Profil
Ten výpis v tabulce:
<table>
<?php
        $cols = 3; # počet sloupců
        $images = scandir($uploadDir);
        $images2 = array();
        foreach($images as $img){
          if($img !== "." and $img !== "..") $images2[] = $img;
          }      
        $size = count($images2);        
        for($i=0; $i<ceil($size/$cols); $i++){
          echo "<tr>";
          for($ii=0; $ii<$cols; $ii++){
            if(!empty($images2[($i*$cols)+$ii])){
              echo "<td>".$images2[($i*$cols)+$ii]."</td>";
              }
            else{
              break;
              }
            }
          echo "</tr>";
          }  
      ?>
</table>
Nelíbí se mi odstranění "." a ".." z prvního pole (a ještě k tomu musím celé pole vytvářet, teoreticky kopírovat, znovu kvůli indexování). Asi by šel vymyslet i lepší způsob, ale funguje to...
rotorod
Profil *
ano zapomněl jsem na ten přepis. omlouvám se, je to ok. Jen mě zmatlo že to napsalo že obrazek nahrany a přitom tzv nebyl, bo to nepřepsalo

sloupce super. jen jestli mohu 3 věci k sloupcum
- kde zakomponovat <li></li> abych tam viděl tu tečku? je to lepší
- jde nějak dát odsazení mezi sloupci?
- jde udělat aby v tom seznamu, to co se nahralo, aby bylo jako první v seznamu?
děkuji
Keeehi
Profil
rotorod:
Jde udělat všechno. Evidentně nezvládáš vůbec nic, jen lepší k sobě části kódů co na internetu najdeš. Pokud chceš, aby za tebe někdo odvedl práci, tak na tu je sekce Práce a zakázky
RastyAmateur
Profil
rotorod:
- Ano jde, ale ručně (možná by to šlo i seznamem, ale ručně mi to přijde lepší). Uprav řádek 14 z [#10] na echo "<td>&bull;&nbsp;".$images2[($i*$cols)+$ii]."</td>";
- Do stylů přidej table td{ padding: 5px 10px; }První číslo (5px) dává odsazení shora a zdola a druhé číslo (10px) zleva a zprava
- Asi by to šlo, ale popravdě nechci se tím zabývat. Jestli chceš, udělej si to sám podle návodu, ale mně se do toho nechce. Mám ještě svou práci a nemám čas hledat, co která funkce dělá, abych tomu dobře rozuměl a podal přesný výsledek.

Jinak souhlasím s Keeehim, původně jsem si myslel, že jen neumíš v PHP, ale jak se zdá, tak ani v HTML či CSS. Kdyby jsi si podal žádost do Práce a zakázky (viz. Keeehi), určitě by se našla nějaká dobrá duše, která by to udělala rychle a dobře...


rotorod:
Moc to neřeš, nemyslíme to špatně :-) Klidně se ptej dál, ale třídit podle data nahrání, to se mi moc dělat nechce. To by bylo nejlepší udělat asi pomocí databáze...
rotorod
Profil *
rozumím a děkuji ti Rasty, moc si mi pomohl a je pravda co řikate, stydím se ale děkuji
RastyAmateur
Profil
rotorod:
není zač se stydět a já jsem se alespoň něco přiučil. :-)
rotorod
Profil
dobrý den
mohl bych mít na Rastyho nebo i někoho jiného ještě jeden dotaz, prosbu?
potřeboval bych do tohoto kodu někde zakopletovat jednu funkci. Aby v tom vypisu nahranych obrazku byla možnost smazani jednotlivého obrazku. (třeba znaménkem X).
mohl bych mit prosbu kdyby někdo z Vás napsal takovýto kod a zakomponoval albo napsal kde ho vložit? Budu moc vděčen a vím že tady se to moc nehodí, ale klidně se nějak odměním, pokud bude třeba.
předem děkuji a omlouvám se
RastyAmateur
Profil
rotorod:
Tak PHP kód bude (Dej ho nejspíš úplně na začátek, ihned za značku <body>):
<?php
  $delete = isset($_GET["delete"]) ? $_GET["delete"] : null;
  if(!empty($delete)){
    $dir = "obrazky";
    if(file_exists($dir."/".$delete)){
      $unlink = unlink($dir."/".$delete);
      if($unlink) echo "<h1>Soubor ".$delete." byl smazán!</h1>"; else echo "<h1>Někde se stala chyba, soubor nebyl smazán!</h1>";
      }
    }
?>
Přičemž upravíš kód z [#10] na řádce 14:
echo "<td>".$images2[($i*$cols)+$ii]."<a href="?delete=".$images2[($i*$cols)+$ii].">X</a></td>";
To zvýrazněné X je to tlačítko, odkaz. Tam už si dej pomocí HTML co chceš. Možná lépe by vypadalo
echo "<td>".$images2[($i*$cols)+$ii]."<a href="?delete=".$images2[($i*$cols)+$ii]."><button>Smazat</button></a></td>";

Snad bude kód fungovat. Kdyby ne, piš!
rotorod
Profil
tak nefunguje ten řádek 14, tam vypisuje eror. Posilam raději screen, aby bylo vidět ty barvy, ten odkaz <a href> je již zelené barvy a by být asi neměl
Fisir
Profil
Reaguji na rotoroda:
Musíš uvozovky buď escapovat, nebo je zaměnit za jednoduché:
echo "<td>".$images2[($i*$cols)+$ii]."<a href=\"?delete=".$images2[($i*$cols)+$ii]."\">X</a></td>";
echo "<td>".$images2[($i*$cols)+$ii].'<a href="?delete='.$images2[($i*$cols)+$ii].'">X</a></td>';
RastyAmateur
Profil
Fisir:
Děkuji, ani jsem si toho nevšiml...
rotorod
Profil
děkuji za opravu, ale křížek nic nesmaže. ono se to přesměruje že by to mělo byt smazano, ale nic ani nepiše a nesmaže. Dal jsem to hned za <body>
jestli tak vkladam cely kod a předem děkuji
<body>
    
    <?php
  $delete = isset($_GET["delete"]) ? $_GET["delete"] : null;
  if(!empty($delete)){
    $dir = "obrazky";
    if(file_exists($dir."/".$delete)){
      $unlink = unlink($dir."/".$delete);
      if($unlink) echo "<h1>Soubor ".$delete." byl smazán!</h1>"; else echo "<h1>Někde se stala chyba, soubor nebyl smazán!</h1>";
      }
    }




    
      $uploadDir = '../obrazky'; // adresar, kam se maji nahrat obrazky (bez lomitka na konci)
      $allowedExt = array('jpg', 'jpeg', 'png', 'gif', 'pdf'); // pole s povolenymi priponami
      
      // zpracovani uploadu
      if(!empty($_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];
          
          
          if(file_exists($uploadDir."/".$_FILES['obrazky']['name'][$klic]) || !isset($allowedExt[strtolower(pathinfo($fileName, PATHINFO_EXTENSION))])){
            continue;
            }
           
          if(move_uploaded_file($tmpName, "{$uploadDir}".DIRECTORY_SEPARATOR."{$fileName}")) {
            ++$counter;
            }
          }
         
       if ($counter > 0)
    echo "<p>Bylo nahráno {$counter} z ".sizeof($_FILES['obrazky']['name'])." obrázků!</p>"."<br>";
    else
    echo "!!!Při nahrávání souboru došlo k chybě, nic se nenehrálo!!!"."<br>"; 
        } 
    ?>
      
        <br>
    <form method="post" enctype="multipart/form-data">
      <input type="file" name="obrazky[]" multiple="multiple" />
      <input type="submit" value="Nahrát" />
    </form>
    
        <br>
    
   <div id="table"> 
    <table>
<?php
        # Výpis všech obrázků
        $cols = 3; # počet sloupců
        $images = scandir($uploadDir);
        $images2 = array();
        foreach($images as $img){
          if($img !== "." and $img !== "..") $images2[] = $img;
          }      
        $size = count($images2);        
        for($i=0; $i<ceil($size/$cols); $i++){
          echo "<tr>";
          for($ii=0; $ii<$cols; $ii++){
            if(!empty($images2[($i*$cols)+$ii])){
              echo "<td>&bull;&nbsp;".$images2[($i*$cols)+$ii].'<a href="?delete='.$images2[($i*$cols)+$ii].'">&nbsp;X</a></td>';
              }
            else{
              break;
              }
            }
          echo "</tr>";
          }  
      ?>
     </table>
   </div>
    
  </body>
RastyAmateur
Profil
rotorod:
Vyzkoušej na řádce 6 upravit na $dir = "../obrazky";. Teď na to koukam, a tam níž (line 17) máš určenou složku na nahrávání obrázků jako "../obrazky". Já zde měl pouze "obrazky"... Mohlo by to být ono.

Pokud ten kód upravíš na:
$delete = isset($_GET["delete"]) ? $_GET["delete"] : null;
  if(!empty($delete)){
    $dir = "obrazky";
    if(file_exists($dir."/".$delete)){
      $unlink = unlink($dir."/".$delete);
      if($unlink) echo "<h1>Soubor ".$delete." byl smazán!</h1>"; else echo "<h1>Někde se stala chyba, soubor nebyl smazán!</h1>";
      }
    else{
      echo "<h1>Soubor nenalezen!</h1>";
      }
    }
tak ti to vypíše, jestli byl soubor nalezen. I když se to budeš snažit oklamat a upravíš si URL adresu, tak ti to vypíše toto. Ale to už je jen vedlejší...
rotorod
Profil
ani "../obrazky", ani s jednoduchyma....tohle jsem zkoušel jako prvni a nešlo a pak sem psal. a teraz po změně kodu mi ani do SOUBOR NENALEZEN nenapiše. furt stejne-nic
RastyAmateur
Profil
rotorod:
Tak to nevím. Zkontroluj, jestli url adresa je opravdu ve tvaru soubor.php?delete=obrazek.jpg...
Lonanek
Profil
Pokud to nic nevypíše, pak je $delete prázdné.
Otestujte si co obsahuje $delete.
RastyAmateur
Profil
rotorod:
Tak jsem si to stahnul a rozjel na localu, a nevím, co na tom nefungovalo. Kód:
<!doctype html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    
    <?php
  $delete = isset($_GET["delete"]) ? $_GET["delete"] : null;
  if(!empty($delete)){
    $dir = "../obrazky";
    if(file_exists($dir."/".$delete)){
      $unlink = unlink($dir."/".$delete);
      if($unlink) echo "<h1>Soubor ".$delete." byl smazán!</h1>"; else echo "<h1>Někde se stala chyba, soubor nebyl smazán!</h1>";
      }
    else{
      echo "<h1>Soubor nenalezen!</h1>";
      }
    }
 
 
 
 
    
      $uploadDir = '../obrazky'; // adresar, kam se maji nahrat obrazky (bez lomitka na konci)
      $allowedExt = array('jpg', 'jpeg', 'png', 'gif', 'pdf'); // pole s povolenymi priponami
      
      // zpracovani uploadu
      if(!empty($_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];
          
          
          if(file_exists($uploadDir."/".$_FILES['obrazky']['name'][$klic]) || !isset($allowedExt[strtolower(pathinfo($fileName, PATHINFO_EXTENSION))])){
            continue;
            }
           
          if(move_uploaded_file($tmpName, "{$uploadDir}".DIRECTORY_SEPARATOR."{$fileName}")) {
            ++$counter;
            }
          }
         
       if ($counter > 0)
    echo "<p>Bylo nahráno {$counter} z ".sizeof($_FILES['obrazky']['name'])." obrázků!</p>"."<br>";
    else
    echo "!!!Při nahrávání souboru došlo k chybě, nic se nenehrálo!!!"."<br>"; 
        } 
    ?>
      
        <br>
    <form method="post" enctype="multipart/form-data">
      <input type="file" name="obrazky[]" multiple="multiple" />
      <input type="submit" value="Nahrát" />
    </form>
    
        <br>
    
   <div id="table"> 
    <table>
<?php
        # Výpis všech obrázků
        $cols = 3; # počet sloupců
        $images = scandir($uploadDir);
        $images2 = array();
        foreach($images as $img){
          if($img !== "." and $img !== "..") $images2[] = $img;
          }      
        $size = count($images2);        
        for($i=0; $i<ceil($size/$cols); $i++){
          echo "<tr>";
          for($ii=0; $ii<$cols; $ii++){
            if(!empty($images2[($i*$cols)+$ii])){
              echo "<td>&bull;&nbsp;".$images2[($i*$cols)+$ii].'<a href="?delete='.$images2[($i*$cols)+$ii].'">&nbsp;X</a></td>';
              }
            else{
              break;
              }
            }
          echo "</tr>";
          }  
      ?>
     </table>
   </div>
    
  </body>
</html>
V nějaké složce "imgproject"(nezáleží na jméně) jsem měl složku "obrazky" (záleží na jméně) a ještě jednu složku "index" (nezáleží na jméně). Do té složky index jsem dal ten kód, a šlo to suprově!
rotorod
Profil
ano, nahraju obrazek podnos.jpg
pak zmačknu X že ho chci smazat a v url mám www.../admin/?delete=podnos.jpg
akorát fotky jsou ve složce obrazky, takže cesta neni ok?
RastyAmateur
Profil
rotorod:
ne, tu cestu označuje proměnná $dir
Lonanek
Profil
rotorod:
ano, nahraju obrazek podnos.jpg
Kam? Do jaké složky, nejlépe uvést relativně k rootu domény.

akorát fotky jsou ve složce obrazky, takže cesta neni ok?
A obrázek nemůže být fotka? Nebo jak tomuto tvrzení rozumět?
RastyAmateur
Profil
Lonanek:
On myslel "../obrazky" a "obrazky" (proměnná, která se zadává do funkce file_exists() a unlink()
« 1 2 »

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0