Autor | Zpráva | ||
---|---|---|---|
tomasj Profil * |
#1 · Zasláno: 14. 1. 2008, 17:38:03
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 |
#2 · Zasláno: 14. 1. 2008, 17:48:21
Takovej blbej dotaz.
Proč všude používás $_FILES['fupload'] a jenom u eregi používáš $_FILES['upload'] ?? |
||
tomasj Profil * |
#3 · Zasláno: 14. 1. 2008, 17:51:30
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 |
#4 · Zasláno: 14. 1. 2008, 18:02:10
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 |
#5 · Zasláno: 14. 1. 2008, 18:08:54
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 |
#6 · Zasláno: 14. 1. 2008, 19:02:16
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 |
#7 · Zasláno: 14. 1. 2008, 23:20:05
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.
|
||
Časová prodleva: 3 měsíce
|
|||
Mara Profil * |
#8 · Zasláno: 12. 4. 2008, 17:27:31
<? 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 * |
#9 · Zasláno: 12. 4. 2008, 17:48:16
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 |
#10 · Zasláno: 12. 4. 2008, 17:59:28
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 * |
#11 · Zasláno: 12. 4. 2008, 18:18:09
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. |
||
Časová prodleva: 16 let
|
0