PHP -- třída pro upload souborů FUpload

Napsal O webu (») 8. 3. 2007 v kategorii PHP/HTML, přečteno: 4043×

Potřebujete uploadovat data z vašich stránek na server? Mám pro Vás jednoduché řešení.

Úvod

Pakliže máte potřebu uploadovat data z Vašich stránek (například obrázky do fotogalerie, soubory do CMS atp.), můžete použít tuto jednoduchou třídu.

Popis

Třída je navržena s těmito požadavky:
1, použití OOP.
2, použití pouze jednoho vstupního pole pro zadání cesty a názvu souboru uploadovaného souboru.
3, automatické rozpoznání názvu NAME pole pro zadání cesty a názvu souboru uploadovaného souboru ve formuláři.
4, filtrace MIME obsahu uploadovaných souborů.
5, odchycení a ošetření chyb na straně serveru.
6. čtenář má alespoň základní znalosti jazyku PHP a HTML.

Popis členských funkcí

Z vně progamu potřebujeme ke správnému běhu třídy pouze pár funkcí, zde je jejich popis:

bool setMIMEAccept(mixed MIMEAccept)
Popis funkce: nastaví MIME obsah uploadovaných souborů, které bude třída přijímat.
Argument funkce: řetězec, nebo pole řetězců MIME, když je řetězec prázdný, jsou přijaty všechny MIME typy souborů.
Vrací: true při úspěšném nastavení, jinak false.
Poznámka: použiji, když chci uploadovat jenom určité typy souborů, například pro obrázky formátu JPEG je MIME image/jpeg, pro dokumenty typu WORD je MIME application/msword.

mixed setUploadData(array uploadDataArr)
Popis funkce: naplní třídů daty z formuláře pro uploadování souborů.
Argument funkce: pole $_FILES.
Vrací: číslo chyby statusu přenosu uploadovaného souboru při chybě přenosu uploadovaného souboru (hodnoty 1~4), true při úspěchu (uploadovaný soubor se nachází v temp adresáři serveru), jinak false.
Vypisuje chyby číslo: 1, 2, 3, 4, 5, 6, 9, 10.

bool setTargetPath(str filePath, str fileName, str mode)
Popis funkce: nastaví cestu, název souboru a způsob vytvoření názvu souboru pro umístění uploadovaného souboru do cílového adresáře.
Argumenty funkce: řetězec filePath je povinný a ukazuje na adresář na serveru, do kterého má být uploadovaný soubor uložen. Adresář musí existovat, musí mít nastaveno příslušné oprávnění (čtení a zápis). Název nesmí obsahovat koncové lomítko.
Řetězec mode slouží pro určení způsobu vytvoření názvu uploadovaného souboru na serveru.
Hodnoty jsou:
FU_IMP pro převzetí a použití názvu souboru z formuláře (uložený soubor na serveru bude mít shodný název jako název uploadovaného souboru aniž by jsme museli explicitně název zadávat). Hodnota argumentu fileName se zahodí, ale musí být vyplněna (nejčastěji hodnotou null).
FU_EXP pro zadání, pod jakým názvem se uploadovaný soubor na server uloží. Pak je vyplnění argumentů filePath a fileName povinné.
Vrací: true při úspěšném nastavení, jinak false.
Vypisuje chyby číslo: 7, 8.

bool upload()
Popis funkce: přesune uploadovaný soubor z temp adresáře serveru do cílového adresáře.
Vrací: true při úspěchu, jinak false.
Vypisuje chybu číslo: 11.

array getUploadContent()
Popis funkce: vrací dvourozměrné pole s popisem uploadovaného souboru:
název NAME pole pro zadání cesty a názvu souboru uploadovaného souboru ve formuláři, a v tomto poli pole s informacemi:
name: název uploadovaného souboru.
type: MIME obsah.
tmp_name: název uploadovaného souboru na serveru.
error: status chyby při přenosu souboru.
size: velikost souboru v bytech.
Vrací: dvourozměrné pole s popisem uploadovaného souboru.

str errorDesc()
Popis funkce: vrací popis chyby.
Vrací: řetězec popisu vzniklé chyby při uploadu souboru.
Použití: řízený chybových výstupů.

Zdrojový kód


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_name'], $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;

}

}


Příklad implementace

Celý příklad uložíme do jediného souboru, který se bude jmenovat fupload.class.php.
Nejdříve začneme třeba u HTML kódu formuláře, ze kterého budeme soubory odesílat.
Krom napsání pole pro zadání souborů pro upload a tlačítka pro odeslání formuláře je vhodné, aby samotný tag formuláře
obsahoval krom názvu zpracujícího souboru action, metody odeslání dat z formuláře method i způsob zakódování dat enctype.

<html>

<body>

<form action='fupload.class.php' method='post' enctype='multipart/form-data'>

<input type="file" name='upload' />

<input type="submit" />

</form>

</body>

</html>


Nyní již pokračujeme kódem PHP. Pro funkčnost v našem příkladu je potřeba, aby se zdrojový kód samotné třídy nacházel v našem souboru. Proto ho do souboru zkopírujeme.
Teď si ukážeme, jak implementovat funkce ze třídy tak, aby upload skutečně fungoval:

//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();


Závěr

To jest vše. Věřím, že vám bude tento kousek kódu užitečný. S pozdravem C0D3M4K3R.
Autor: C0D3M4K3R
Facebook Twitter Topčlánky.cz Linkuj.cz

Komentáře

Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
Článek ještě nebyl okomentován.


Nový komentář

Téma:
Jméno:
Notif. e-mail *:
Komentář:
  [b] [obr]
Odpovězte prosím číslicemi: Součet čísel deset a dvanáct