Autor | Zpráva | ||
---|---|---|---|
timbuktata Profil * |
#1 · Zasláno: 27. 11. 2007, 20:55:32
čau, chtěl jsem si zkusit příklad s File Upload, z webu http://www.owebu.cz/php/vypis.php?clanek=963 , ale pořád mi to hází chybu 11-Soubor oznaceny jako uploadovany neni uploadovany nebo uploadovany soubor nelze presunout. Nevíte co je špatně, když jsem to jem zkopíroval, tak by to mělo jet ne?
FileUpload.html <html> <head> <title>Session</title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1250"> </head> <body> <form action='fupload.class.php' method='post' enctype='multipart/form-data'> <input type="file" name='upload' /> <input type="submit" /> </form> </body> </html> fupload.class.php <?php class fupload { //pole s akceptovaným MIME obsahem var $MIMEAccept; //pole $_FILES s uploadovanými daty var $uploadDataArr; //název pole NAME vložení uploadovaného souboru formuláře var $fileFormName; //popis chyby var $errorDesc; //cílová cesta a název uploadovaného souboru var $ufilePath; var $ufileFilename; //konstruktor function fupload() { $this->MIMEAccept = null; $this->uploadDataArr = null; $this->fileFormName = null; $this->errorDesc = null; $this->ufilePath = null; $this->ufileFilename = null; } //převezme uploadovaná data, argumentem je předané pole $_FILES //vrací true když jsou uploadovaná data v pořádku, soubor je v tmp adresáři na serveru a vyhovuje filtru MIME obsahu, jinak false nebo číslo chyby statusu přenosu uploadovaného souboru function setUploadData($uploadDataArr) { //testuji, zdali je převzatá proměnná typu pole if (is_array($uploadDataArr)) { $this->uploadDataArr = $uploadDataArr; //zjistí název pole vložení uploadovaného souboru formuláře //naplní pole se všemi názvy polí NAME vložení uploadovaného souboru formuláře $tmp = @array_keys($this->uploadDataArr); if (!empty($tmp)) { //platný je první název pole NAME, další se zahodí $this->fileFormName = $tmp[0]; //rozlišení statusu chyby při přenosu souboru, při chybě vrací číslo chyby statusu + 10, jinak true switch ($this->uploadDataArr[$this->fileFormName]['error']) { case 4: $this->isError = true; $this->errorDesc = "Chyba FUpload :: 4 :: Soubor nebyl uploadovan"; return 4; break; case 3: $this->isError = true; $this->errorDesc = "Chyba FUpload :: 3 :: Uploadovala se pouze cast souboru"; return 3; break; case 2: $this->isError = true; $this->errorDesc = "Chyba FUpload :: 2 :: Velikost uploadovaneho souboru je vetsi nez dovoluje formular"; return 2; break; case 1: $this->isError = true; $this->errorDesc = "Chyba FUpload :: 1 :: Velikost uploadovaneho souboru je vetsi nez dovoluje server"; return 1; break; case 0: //uploadovaný soubor je v tmp adresáři na serveru //test, jestli vyhovuje MIME filtru obsahu if (!empty($this->MIMEAccept)) { //filtr MIME obsahuje položky, test jestli je položek více if (is_array($this->MIMEAccept)) { if (in_array($this->uploadDataArr[$this->fileFormName]['type'], $this->MIMEAccept)) { //soubor vyhovuje MIME obsahu return true; } else { //soubor nevyhovuje MIME obsahu $this->isError = true; $this->errorDesc = "Chyba FUpload :: 9 :: MIME obsah uploadovaneho souboru nevyhovuje nastavenemu filtru"; return false; } } else { //jedna položka v MIME filtru, test jestli vyhovuje if ($this->uploadDataArr[$this->fileFormName]['type'] == $this->MIMEAccept) { //soubor vyhovuje MIME obsahu return true; } else { //soubor nevyhovuje MIME obsahu $this->isError = true; $this->errorDesc = "Chyba FUpload :: 9 :: MIME obsah uploadovaného souboru nevyhovuje nastavenemu filtru"; return false; } } } return true; break; default: $this->isError = true; $this->errorDesc = "Chyba FUpload :: 10 :: Nerozeznana chyba pri uploadovani souboru"; return false; break; } } else { //chyba $this->isError = true; $this->errorDesc = "Chyba FUpload :: 5 :: Neni definovan nazev pole 'NAME' vlozeni uploadovaneho souboru formulare"; return false; } } else { //chyba, pokud předávané pole není pole $this->isError = true; $this->errorDesc = "Chyba FUpload :: 6 :: Vyzaduje pole s informacemi o uploadovanem souboru nejcasteji _FILES, zadana promenna neni typu pole"; return false; } } //nastaví akceptovaný MIME obsah -- filtr uploadovaných dat, argument je pole MIME typů obsahu //vrací pokaždé true function setMIMEAccept($MIMEAccept) { $this->MIMEAccept = $MIMEAccept; return true; } //vrací popis uploadovaného souboru jako pole function getUploadContent () { return $this->uploadDataArr; } //nastaví název uploadovaného souboru a cílovou cestu, kam se má uploadovaný soubor uložit a způsob výběru názvu souboru //vrací true když cílová cesta existuje a název souboru je definovatelný dle pravidel výše, jinak false function setTargetPath($filePath, $fileName, $mode) { if ($mode == 'FU_IMP' && !empty($filePath)) { //stejný název souboru jako uploadovaný, nenulový řetězec cesty kam se má soubor uložit //uložím název souboru $this->ufileFilename = $this->uploadDataArr[$this->fileFormName]['name']; //cesta do adresáře, kam se má soubor uložit musí existovat if (@is_dir(trim($filePath))) { $this->ufilePath = $filePath; return true; } else { //chyba $this->isError = true; $this->errorDesc = "Chyba FUpload :: 8 :: Zadana cesta : " . $filePath . " : adresare, kam se ma uploadovany soubor ulozit neexistuje, nebo nejsou nastavena potrebna opravnení"; return false; } } elseif ($mode == 'FU_EXP' && !empty($fileName) && !empty($filePath)) { //jiný název souboru než uploadovaný, nenulový řetězec cesty kam se má soubor uložit $this->ufileFilename = $fileName; $this->ufilePath = $filePath; return true; } else { //chyba $this->errorDesc = "Chyba FUpload :: 7 :: Chybne zadani nebo kombinace konstanty zpusobu vyberu nazvu souboru, nazvu souboru nebo cesty, kam se ma soubor ulozit"; return false; } return false; } //přesune soubor na cílové umístění, vrací true při úspěchu, jinak false function upload() { if (@is_uploaded_file($this->uploadDataArr[$this->fileFormName]['tmp_name ']) && @move_uploaded_file($this->uploadDataArr[$this->fileFormName]['tmp_nam e'], $this->ufilePath . "/" . $this->ufileFilename)) { //vyprázdnění dat $this->MIMEAccept = null; $this->uploadDataArr = null; $this->fileFormName = null; $this->isError = false; $this->errorDesc = null; $this->ufilePath = null; $this->ufileFilename = null; return true; } $this->errorDesc = "Chyba FUpload :: 11 :: Soubor oznaceny jako uploadovany neni uploadovany nebo uploadovany soubor nelze presunout"; return false; } //vrací popis chyby, která nastala, vynuluje příznak chyby a text chybového hlášení function errorDesc() { $tmp = $this->errorDesc; $this->errorDesc = null; return $tmp; } } //nejdříve vytvoříme instanci třídy fupload -- objekt (viz. Objektově Orientované Programování) $iFUpload = new fupload; //zde si definuji, které soubory MIME chci, aby se mi uploadovaly; pro příklad to bude výše zmíněný JPEG obrázek a dokument MSWord $mime = array("image/jpeg", "application/msword"); $iFUpload->setMIMEAccept($mime); //dále si řeknu, kam se mi uploadované obrázky a dokumenty budou ukládat. Pro příklad použiji způsob vytvoření souboru z názvu souboru zadaného ve formuláři (všimněte si, že cestu k adresáři mám zadanou bez koncového lomítka) $iFUpload->setTargetPath("c:/temp", NULL, "FU_IMP"); //nyní naplním objekt daty z formuláře (ty jsou obsažena v poli $_FILES) $iFUpload->setUploadData($_FILES); //a přesunu soubor $iFUpload->upload(); //když se něco nepovede, tak si nechám vypsat chyby print $iFUpload->errorDesc(); ?> |
||
Tomáš Hanus Profil |
#2 · Zasláno: 27. 11. 2007, 21:08:11
Jinak chyba 11 nastane, kdyz se pokousi presunout dany soubor z temp adresáře do cílového. Zde bude chyba.
|
||
timbuktata Profil * |
#3 · Zasláno: 27. 11. 2007, 21:26:58
děkuji za odpověď. nastavený soubor pro ukládání je c: emp ne? takže by se tam soubor měl automaticky přemístit? jinak jsem to zkoušel jak lokálně, tak na webu, ale nic nejde.
|
||
DFly Profil |
#4 · Zasláno: 27. 11. 2007, 23:50:33
co zkusit vyhazet ty zavinace, a nechat si chyby vypsat od PHP
|
||
timbuktata Profil * |
#5 · Zasláno: 28. 11. 2007, 16:39:21
tak když vyhodim zavináče, tak php hodí tuto chybu
Warning: move_uploaded_file(c:/temp/): failed to open stream: Permission denied in c:program fileseasyphp1-8wwwfupload.class.php on line 310 Warning: move_uploaded_file(): Unable to move 'C:PROGRA~1EASYPH~1\tmpphpF2.tmp' to 'c:/temp/' in c:program fileseasyphp1-8wwwfupload.class.php on line 310 Chyba FUpload :: 11 :: Soubor oznaceny jako uploadovany neni uploadovany nebo uploadovany soubor nelze presunout |
||
DFly Profil |
#6 · Zasláno: 28. 11. 2007, 16:56:03
pak by to z te hlasky melo byt jasne: Permission denied u fce move_uploaded_file()...
pro adminy techto stranek: nemelo by byt nekde popsano par zakladnich (nejcastejsich) problemu jako je treba upload (s linky do manualu) a velikosti H1 napsano PRÁVA, PRÁVA, PRÁVA... :-) protoze problemy s uploadem jsou tu nejmene vzdy dva na te same strance... |
||
tiso Profil |
#7 · Zasláno: 28. 11. 2007, 18:12:17
DFly - myslíš
toto ? Ale tento príklad tam chýba... |
||
timbuktata Profil * |
#8 · Zasláno: 28. 11. 2007, 18:53:36
tak s těma právama to je divný, protože i když to dělám lokálně tak to nejde a tam bych měl mít práva všude.
|
||
Časová prodleva: 11 měsíců
|
|||
Matalion Profil * |
#9 · Zasláno: 5. 11. 2008, 18:11:42
pokud jsi na ic nebo webzdarma tak ti to nepujde
|
||
bohyn Profil |
#10 · Zasláno: 5. 11. 2008, 18:30:23 · Upravil/a: bohyn
V tomto pripade zakroci direktiva basedir ktera te nepusti do nadrazeneho adresare tvych stranek. Basedir se aplikuje i pri vypnutem sefe_mode. Udelej si temp v adresari co mas svoje stranky.
Edit: Matalion pokud jsi na ic nebo webzdarma tak ti to nepujde Tohle ti nepojede na zadnym ne-kamikadze hostingu |
||
Časová prodleva: 3 měsíce
|
|||
forkman Profil * |
#11 · Zasláno: 22. 1. 2009, 22:12:10
Mohl by mi někdo vysvětlit proč mi to taky nefunguje? když si dám 2 řádky nad volání metody move_uploaded_file($_FILES['upload']['tmp_name'],$_FILES['upload']['name']);, tak to normálně funguje, ale metoda upload mně stejně vždycky vypíše chybu číslo 11, několikrát zmiňovanou.
|
||
Časová prodleva: 14 let
|
0