Autor Zpráva
tomasj
Profil *
Zdravím

Vytvořil jsem si na svoje stránky následující uploadovač souborů
  <?
if (isset($_FILES['fupload']))
  {
if(eregi('[[:alnum:]]+/[p]*jp[e]*g', $_FILES['upload']['type'])) {  //  Podmínka na typ souboru, který musí být pouze JPEG 
    $slozka = "atlas-ryb"; // Zde si napište svojí složku, do které se budou soubory ukládat (bez lomítka)
    $cil = $slozka . "/" .$_FILES['fupload']['name']; // Toto je proměnná $cil, která obsahuje adresář, kde se má soubor uploadovat a taky název souboru.
    $nazev_souboru = $_FILES['fupload']['tmp_name']; // Zjistí dočastné umístění souboru
    $copy = move_uploaded_file($nazev_souboru, $cil) // A tady zkopíruje soubor z dočastného umístění do cílového souboru a složky
      or die ("Přenesený soubor nelze zkopírovat"); // A pokud se nepovede, tak vypíše tuto hlášku
    chmod ($cil, 0644); // Ještě na soubor vyhodíme funkci chmod, která změní jeho práva na maximum, pokud by soubor psal chybu změňte 0644 na 0777
    if($copy == true){ // Pokud se kopírování provede úspěšně
      echo "Soubor " .$_FILES['fupload']['name']. " byl úspěšně nahrán na server.\n<br><a href=\"$cil\">Jdi na soubor</a>";
    }else{
      echo "Soubor nemohl být nahrán.\nPočet chyb: " . $_FILES['fupload']['error'];
    }
    }else{
    echo "Lze nahrávat pouze soubory typu JPEG!";
    }
    }
    if (is_uploaded_file($_FILES["jmeno_souboru"]["tmp_name"])){
  $id=$_POST['id'];
  $soubor = $_FILES['fupload']['name'];
  $idautora = $_SESSION['UserId'] ;
  $autor = $_SESSION['login'] ;
  $jmenoryby=$_POST['jmenoryby'];
    if ($id=="")  { // pokud nebylo vyplněno něco z toho, co je povinné, dáme vědět a skript ukončíme
      $backlink="http://akvaweb.cz/fotka-ryb.php?id=$id&Alert=1";}
      else
{

$vysledek=mysql_query("INSERT INTO fotkyryb (idryby,fotka,idautora,autor,jmenoryby) VALUES ('$id','$soubor','$idautora','$autor','$jmenoryby')");
$backlink="http://akvaweb.cz/atlas-ryb.php?ryba=$id";
}
header ("Location: $backlink");
}
   
  
  
?>
  



A mám dva zásadní problémy:


První je, že podmínka pro typ souboru a sice JPEG nefunguje...Vyhazuje mi to pořád hlášku, že soubor není JPEG i když jím ve skutečnosti je...

Další problém je , že bych potřeboval jméno souboru změnit (přejmenovat) a chtěl bych jej změnit za číslo, které bude udávat počet fotek v adresáři (dir atlas-ryb) a přičte se k ní 1 (++) . Tímto se mi vlastně budou všechny fotky jakoby "řadit podle id" a nedojde nikdy k tomu, že by daný soubor existoval víckrát se stejným číslem.. Teorietickou otázku mám vyřešenou, teď prosím o radu s tou praktickou.
BetaCam
Profil
Takovej blbej dotaz.

Proč všude používás $_FILES['fupload'] a jenom u eregi používáš $_FILES['upload'] ??
tomasj
Profil *
Spojil jsem bezmyšlenkovitě dva kody...Díky za upozornění...Tím by se měl vyřešit první problém;-)
ninja
Profil
tomasj: u funkce move_uploaded_file() preci zadavas jmeno noveho souboru (v cilovem umisteni), tak proste zadej tebou pozadovane.

Pozadovane jmeno souboru zjistis bud nejak ze sve databaze nebo ze si vypises vsechny soubory v cilovem adresari, najdes ten oznaceny nejvyssim cislem a prictes k nemu jednicku.
BetaCam
Profil
ninja

Přikláněl bych se k té DB či souboru oddelenému v jiném adresáři, Protože s rostoucím počtem souborů by se mohl čas pro průchod adresáře neúměrně natáhnout.

Další věc je, že budeš muset ošetřit upload ve stejný okamžik. Aby dva lidé nedostali stejný název souboru.
ninja
Profil
BetaCam: souhlas. Vetsinou pouzivam pro kazdy zapis v db (treba jedno zbozi, uzivatel, clanek, atd.) vlastni adresar a do nej to pak hazet.

Vyhnes se tim i omezeni 2000 souboru v jenom adresari (nemusi se tykat vsech os/filesystemu).
peca
Profil
Zatim pouzivas pouze DB k ukladni jmen souboru. Ja to taky tak delam, ale pokud chces ulozit do DB i soubor je ho dobre predtim zakodovat a jeste nekam ukladat mime.
Mara
Profil *
<? if (isset($_FILES['fupload'])) { if(eregi('[[:alnum:]]+/[p]*jp[e]*g', $_FILES['upload']['type'])) { // Podmínka na typ souboru, který musí být pouze JPEG $slozka = "atlas-ryb"; // Zde si napište svojí složku, do které se budou soubory ukládat (bez lomítka) $cil = $slozka . "/" .$_FILES['fupload']['name']; // Toto je proměnná $cil, která obsahuje adresář, kde se má soubor uploadovat a taky název souboru. $nazev_souboru = $_FILES['fupload']['tmp_name']; // Zjistí dočastné umístění souboru $copy = move_uploaded_file($nazev_souboru, $cil) // A tady zkopíruje soubor z dočastného umístění do cílového souboru a složky or die ("Přenesený soubor nelze zkopírovat"); // A pokud se nepovede, tak vypíše tuto hlášku chmod ($cil, 0644); // Ještě na soubor vyhodíme funkci chmod, která změní jeho práva na maximum, pokud by soubor psal chybu změňte 0644 na 0777 if($copy == true){ // Pokud se kopírování provede úspěšně echo "Soubor " .$_FILES['fupload']['name']. " byl úspěšně nahrán na server.\n<br><a href=\"$cil\">Jdi na soubor</a>"; }else{ echo "Soubor nemohl být nahrán.\nPočet chyb: " . $_FILES['fupload']['error']; } }else{ echo "Lze nahrávat pouze soubory typu JPEG!"; } } if (is_uploaded_file($_FILES["jmeno_souboru"]["tmp_name"])){ $id=$_POST['id']; $soubor = $_FILES['fupload']['name']; $idautora = $_SESSION['UserId'] ; $autor = $_SESSION['login'] ; $jmenoryby=$_POST['jmenoryby']; if ($id=="") { // pokud nebylo vyplněno něco z toho, co je povinné, dáme vědět a skript ukončíme $backlink="http://akvaweb.cz/fotka-ryb.php?id=$id&Alert=1";} else { $vysledek=mysql_query("INSERT INTO fotkyryb (idryby,fotka,idautora,autor,jmenoryby) VALUES ('$id','$soubor','$idautora','$autor','$jmenoryby')"); $backlink="http://akvaweb.cz/atlas-ryb.php?ryba=$id"; } header ("Location: $backlink"); } ?>
nesmysl
TSD
Profil *
Mara skvěle poradila.

Já jen poznámku k tomu generování názvu souboru. Řešil jsem něco podobného, ale udělal jsem to tak, že jsem vzal původní název, zjistil jestli soubor toho názvu už v adresáři je a pokud byl, tak jsem ve smyčce testoval totéž pro puvodninazevXXX.jpg, kde XXX byl náhodně vygenerovaný string, dokud jsem nenašel nepoužitou kombinaci. Což v mém případě bylo asi vždy na první pokus :)

Možná se pletu, ale připadá mi úspornější pár několik málo vygenerování stringu než procházení stovek názvů souborů, které se bez hrabání po disku neobejde.

A ještě k ukládání souborů přímo do databáze: docela by mě zajímalo, jakou to pro server představuje zátěž. Máte s tím někdo praktickou zkušenost? Myslím v trochu větší míře než vložit/zobrazit 50 obrázků za den.
Akacko
Profil
TSD
ja bych řekl, že ukládat obrázky přímo do DB je blbost (pokud to funguje tak jak myslím - uloží ten obrázek jako binarní číslo ... takže 1MB obrazek se uloži jako 1MB retezec do db). Lepší je akorat uložit název obrázku do DB a obrázek uploadovat do složky ... potom je i jednoducha kontrola existence nazvu obrázku.
TSD
Profil *
Akacko
Já myslím že datový typ BLOB je vyloženě určen pro podobné použití. A když o tom přemýšlím, tak vložení dat do databáze se od zkopírování souboru na disk až tak moc neliší, jde jen o odlišnou formu téhož.

Jde asi o to, jak je to vložení/vytažení optimalizováno.

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: