Evo neke moje funkcije za upload fajlova. Ima nekih osnovnih provera. Da, komentari su na engleskom, ne zato sto sam ukrao neciji skript pa ga pokusavam uvaliti kao moj, nego sto sam ga stavio na 1phpstreet pa da ga svi razumedu :)
Ova prva funkcija je 'glavna' funkcija (ima dve funkcije). Na kraju sam napisao kako se poziva. Ukratko, proverava da li je
uopste izabran neki fajl za upload, da li je fajl ekstenzije koja se moze uploadovati, da nije veci od 2Mb. Ako sve te provere prodje bez problema, onda pristupa upload-u. Proverava da li postoji direktorijum gde zelimo up-ovati (ako ne onda ga napravi), ako vec fajl sa takvim imenom postoji onda prekida, proverava da li je uspeo da premesti iz tempa u up direktorijum. Na kraju menja dozvole na fajl i vraca putanju do fajla.
Code:
function upload_file($file_to_upload,$file_type,$upload_dir,$permission){
if($file_to_upload == ''){
$uploaded_file = "FALSE";
return $uploaded_file;
exit;
}
elseif(valid_file_type($file_to_upload['name'],$file_type) === "FALSE"){ // checks if file is good
$uploaded_file = "FALSE";
return $uploaded_file;
exit;
}
elseif($file_to_upload['size'] > 2000000){ // if bigger than 2 Mb
$uploaded_file = "FALSE";
return $uploaded_file;
exit;
}
$file_name = $file_to_upload['name'];
$file_temp = $file_to_upload['tmp_name'];
if(!is_dir($upload_dir)){//checks if upload dir exists
mkdir($upload_dir);//if doesn`t, make it
chmod($upload_dir,0777);//change the permissions of the new dir
}
$file_upload = "$upload_dir/$file_name";
if(file_exists($file_upload)){//if the file allready exists
$uploaded_file = "FALSE";
return $uploaded_file;
exit;
}
elseif(!move_uploaded_file($file_temp,"$file_upload")){//tries to move the uploaded file
$uploaded_file = "FALSE";
return $uploaded_file;
exit;
}
else{//if upload and moving the file succeeded
$uploaded_file = $file_upload;
}
//changes the permissions of the newly uploaded file (so we can later do something with it)
chmod($uploaded_file,$permission);
return $uploaded_file; //returns string with /path/to/uploaded/file
}
Ovo je druga funkcija, koja proverava extenzije fajlova. Namerno sam pravio sa substr jer ukoliko idem preko $_FILES['file']['type'] to moze biti koliko browsera toliko tipova. Mozda nije najsretnije resenje, jer (ovo jos nisam stigao da proverim), ukoliko neko promeni extenziju fajla recimo na .gif, a ustvari je nesto drugo, onda ce proci. Al` posto koristim u admin delu i ja up-ujem fajlove, dotle je ovo ok, barem meni. Trenutno je u stanju da proverava gif, jpg, png slike i word, excel i pdf dokumente. Ukoliko treba dodati neki novi tip, recimo swf samo napravim jos jedan niz, u switch ubacim case 3 i sibaj.
Code:
function valid_file_type($file_to_check,$file_type){
/*
* This function checks is $file_to_check a valid file type. Currently it can check for jpg,gif,png,doc,xls,csv,pdf
* More can be added. I grouped the picture types and the document types in 2 arrays
* It cuts the extension of the file, check if its in the proper array. If yes returns TRUE, otherwise FALSE
* for pictures $file_type = 1
* for documents $file_type = 2
*/
$extension = substr($file_to_check,-3);
$picture_extensions = array(
'jpg'=>'jpg',
'JPG'=>'jpg',
'jpeg'=>'jpg',
'JPEG'=>'jpg',
'png'=>'png',
'PNG'=>'png',
'gif'=>'gif',
'GIF'=>'gif'
);
$documents_extensions = array(
'doc'=>'doc',
'DOC'=>'doc',
'pdf'=>'pdf',
'PDF'=>'PDF',
'xls'=>'csv',
'XLS'=>'csv',
'csv'=>'csv',
'CSV'=>'csv'
);
switch ($file_type){
//pictures
case 1:{
if(!array_key_exists($extension, $picture_extensions)){
return "FALSE";
}
else{
return "TRUE";
}
}
break;
//documents
case 2:{
if(!array_key_exists($extension, $documents_extensions)){
return "FALSE";
}
else{
return "TRUE";
}
}
break;
default: return "FALSE";
}
}
I na kraju kako se koristi:
Code:
$uploadovani_fajl = upload_file("slika1.jpg",1,"slike_za_upload",0755);
ako je $uploadovani_fajl FALSE onda upload nije uspeo, a ako je uspeo onda sadrzi putanju do novog uploadovanog fajla, koju upisujem u bazu.
Voleo bih kad bi pogledali ovo, pa da malo prodiskutujemo, da li vam se svidja, kritike, predlozi, kako bi uradili, sta bi menjali (osim provere za extenzije :D) itd...