[Class] File Uploader

Door Citroen Anoniem Graag, 19 jaar geleden, 4.439x bekeken

Dit is mijn eerste script hier. Ik hoop dat veel mensen hem kunnen gebruiken.

Waarom een file-upload classe?
De laatste tijd moest ik veel uploadformulieren in elkaar zetten, en het was altijd zo'n gepruts om het weer allemaal voor elkaar te krijgen dat ik besloot een classe hiervoor te schrijven.

We hebben hier toch al een classe hiervoor?
Hier is inderdaad een oudere upload classe te vinden. Alleen die classe is voor php 4 gemaakt, mist bijvoorbeeld de mime check en gebruikt nog echo's in de functies. Daarom ben ik een nieuwe gaan maken

Ik heb een bug
Dat kan natuurlijk, meld hem ff bij de reacties dan kijk ik er ff naar, de classe is nog in de test fase.

Er zit geen documentatie bij
Dat klopt, maar voel je vrij om er 1 te schrijven ;-)

Over de classe:
Met deze classe kan je alle bestanden die je wilt uploaden, je kan instellen hoe groot de files mogen zijn, en in het geval van een plaatje ook hoe breed en hoe hoog.
De classe heeft de mogelijkheid om op extension en op mime-type te controleren. Dit geldt echter alleen voor plaatjes. Voor andere bestanden (.doc, .txt, .enz) kan je alleen de extension check gebruiken.

Op- of aanmerkingen?
Die zou ik graag horen, dan weet ik wat er voor de volgende versie verbeterd kan worden.

Uitleg:
Simpele class, de functies spreken wel voor zich, zie ook voorbeeld onderaan.
Op het moment dat de class voor iets anders dan voor afbeeldingen wordt gebruikt, werkt mime-type controllen niet meer. Dit komt omdat ik nog geen functie heb gevonden om een mimetype van zo'n bestand te achter halen. Dit is dus niet veilig!

Hoe te gebruiken:
Gooi de class in een map (bv class/cUpload.php), die kan je vervolgens vanuit een ander bestand includen, je stelt de functies in en het werkt.
NB: Krijg je een error met iets als Permission denied, dan moet je de map nog Chmod'den naar 0777. Dit is met een ftp programma een fluitje van een cent.

Voorbeeld: http://www.voorbeeld.d-lightweb.nl/index.php

Gesponsorde koppelingen

PHP script bestanden

  1. class-file-uploader

 

Er zijn 15 reacties op 'Class file uploader'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Manaus
Manaus
19 jaar geleden
 
0 +1 -0 -1
ziet er wel mooi gescript uit op het eerste zicht;)


19 jaar geleden
 
0 +1 -0 -1
Je gebruikt exeptions, waarom doe je dan @chmod($this->sMap, 0777);, dat lijkt mij juist een belangrijke stap...
Citroen Anoniem Graag
Citroen Anoniem Graag
19 jaar geleden
 
0 +1 -0 -1
Op niet-linux bakken heeft het geen zin en wil het wel eens een error geven. Op linux bakken, heb je soms eenvoudig weg de kans niet om te chmod'en (instelling) dus daarom wordt die foutmelding onderdrukt met het @.

Vang je hem op in een exception dan maak je een essentiële stap in je script, maar het moet juist iets optioneels zijn.

Voorbeeld:
Gebruiker heeft linux bak maar de instellingen van de server zijn zo dat je niet mag chmod'en. Dit script geeft geen error/exceptions en chmod ook niets. Het script zal werken als de rechten handmatig worden veranderd.
Is het script afhangelijk van die chmod (dmv exceptions) dan werkt het niet terwijl het zou kunnen werken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
if(!chmod($this->sMap, 0777))
{
    throw new Exception('Chemoden gaat fout, heb je wel linux? en de rechten tot chmoden?');
}
//op deze manier dus essentiel en niet te ontlopen, terwijl het op mijn manier enkel iets toevoegd. Het werkt als het werkt, werkt het niet dan werkt het niet en dan moet je het handmatig oplossen.
Kees Schepers
kees Schepers
19 jaar geleden
 
0 +1 -0 -1
Waarom maak je niet iets zoals:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
class file {
    //heel je class
    public static function upload() {
        //handel je upload af
        return new self();
    }
}


$newfile = file::upload();
?>


Dat vind ik sowieso al meer OO als wat je nu hebt :)
M Ypma
M Ypma
19 jaar geleden
 
0 +1 -0 -1
Ziet er netjes gescript uit idd, ben het eensm et de voorgaande commentaren. Ook wil ik daar aan toevoegen dat ik het jammer vind dat je hebt gekozen voor een if constructie terwijl een switch hier toch mooier op zijn plaats was:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if($sEenheid == 'b')
        {
            $this->iGrootte = abs(ceil($this->iGrootte));
        }
        elseif($sEenheid == 'kb')
        {
            $this->iGrootte = abs(ceil($this->iGrootte * 1024));
        }
        elseif($sEenheid == 'mb')
        {
            $this->iGrootte = abs(ceil($this->iGrootte * 1024 * 1024));
        }
        else
        {
            throw new Exception(__FILE__.' -> '.__CLASS__.' -> '.__FUNCTION__.' -> '.__LINE__.': onbekende eenheid');
        }
Lode
Lode
19 jaar geleden
 
0 +1 -0 -1
Waarom gebruik je engels en Nederlands door elkaar voor je methods?

protected function PushError($sError);
protected function ToBytes($sEenheid);
public function SetFormaat($iBreedte, $iHoogte);
public function SetGrootte($iGrootte, $sEenheid = 'b');

Daarnaast nog een paar puntjes wat mij betreft:
1) human readable filesize, byte conversion e.d. Staat eigenlijk buiten uploads natuurlijk. En kan zodoende in een eigen class eigenlijk.
2) wat is er mis met __construct(){}
3) mime types heb je niks aan... misschien voor display, maar het zegt verder niks!
4) gaat niet werken met een array met upload velden!
5) maxsize mis ik! zie: http://www.phpfreakz.nl/forum.php?forum=1&iid=1135811#id1135828
Deze waarde kan je ook via het formulier meegeven als MAX...
6) Er zijn speciale errors voor uploads, maar daar doe je niks mee...

Het ziet er leuk en netjes uit, maar kan nog een stuk verbeterd worden!
Jurgen assaasas
Jurgen assaasas
19 jaar geleden
 
0 +1 -0 -1
Ik heb ooit ergens een stuk validatie gezien waarbij op MIMETYPE wordt gecheckt of de upload valide is. dus door de eerste zoveel bytes te checken. Heeft iemand hier nog een link van? Dit lijkt mij erg veilig.
Joren de Wit
Joren de Wit
19 jaar geleden
 
0 +1 -0 -1
Het checken op mime type is een van de veiligste methoden die er is, alleen moet je dan wel een betrouwbare manier vinden om het mime type te bepalen.

Het type dat meekomt met de file upload is door de browser van de gebruiker bepaalt en dus absoluut niet te vertrouwen. Dit is veelal gebasseerd op enkel de extensie en totaal niet op de inhoud van het bestand. Een php bestand met extensie .jpg zou doodleuk het mimetype image/jpeg krijgen...

PHP kent de fileinfo extensie waarmee je op een stuk betrouwbaardere manier het mimetype kunt bepalen. Pas als je zeker weet dat je het goede mimetype hebt, kun je er mee werken. Eerder niet!

ps. Verder controleer je in je procedurele code nergens of de $_FILES array wel bestaat en of er wel daadwerkelijk iets geupload is. Dat zul je altijd nog moeten controleren voordat je UploadFile() aanroept...

Zie ook: http://phphulp.nl/forum/showtopic.php?cat=1&id=49045
Lode
Lode
19 jaar geleden
 
0 +1 -0 -1
het mime type zegt niks, nopes, nades!
want het berust op header informatie... en die is heel makkelijk te vervalsen...
wil je echt goed bestanden checken op of dat ze zijn wat ze zeggen dat ze zijn zoals images, zip e.d. lees de interne binairy headers uit!

Dit gaat je serieus tijd kosten, maar goed het geeft ook bonus!
ik kan bij een upload type .gif vertellen of het een animated gif is of niet. En desgewenst het eerste frame converteren als static image. Maar goed is extreem.

Bottomline:
ik zegt het is een image/x-jpg (valse header)
jij opent 'm met imagegetsize(); en je bent de sjaak als ik php in de source stop... dit zegt meer over de functie imagesize(); maar headers zijn GEEN betrouwbare info over het algemeen... En dus moet je ze eigenlijk valideren...

EDIT:
mime-types zijn info, maar berusten standaard nergens op waardheid...
Jurgen assaasas
Jurgen assaasas
19 jaar geleden
 
0 +1 -0 -1
Ja dat bedoelde ik dus, als ik fileupload ga maken wil ik binair gaan checken, maar ik kan dit nergens vinden, ik had eerst ergens een link hier op de site gevonden geloof ik.

Edit:

gevonden dus dit is hem

http://www.phphulp.nl/php/scripts/1/740/
Lode
Lode
19 jaar geleden
 
0 +1 -0 -1
Is heel erg matig uitgevoerd IMO....
bestanden hebben veelal veel meer interne structuur.
Deze info en nog veel meer staat gewoon in RFC's beschreven...

kijk ook eens naar deze.... http://nl2.php.net/manual/en/function.imagecreatefromgif.php#59787
Jurgen assaasas
Jurgen assaasas
19 jaar geleden
 
0 +1 -0 -1
Heb je een voorbeeld hoe je een file veilig upload, dus binair checken?
Lode
Lode
19 jaar geleden
 
0 +1 -0 -1
Ik ben niet zo happig op het uitdelen van mijn code! maar 1tje kan wel vandaag...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class image_validate{
    /**
     * png
     * checks binairy for png markers.
     *
     * @final
     * @static
     * @access public
     * @param array $source
     * @return bool
     */

    final static public function png(array $source){
        if(preg_match('~^\x89\x50\x4E\x47\x0D\x0A~', current($source))){
            next($source);
            if(preg_match('~\x49\x48\x44\x52~', next($source))){
                if(preg_match('~\x49\x45\x4E\x44~', end($source))){
                    return true;
                }
            }
        }

        return false;
    }

?>


$source is opgehaald met file(); in deze...

Deze checkt png headers (IHDR e.d.)... is nog niet optimaal... maar wel al een stuk beter als jou eerdere verwijzing...

EDIT:
Dit is meer binairy checken of het een png is...
Je moet ook opletten voor image hacks natuurlijk! Maar dat mag je zelf gaan vogelen ^^
Jurgen assaasas
Jurgen assaasas
19 jaar geleden
 
0 +1 -0 -1
Ja zo zijn er nog vast nog wel 100 dingen waar je op moet letten maar hoe vaak komen deze zaken nu eigenlijk voor. 99.99% van de gebruikers weet nog niet eens hoe ze een image file binair kunnen openen zodat je de source kan aanpassen en al zouden ze dat weten, dan weten ze toch niet wat ze er in moeten zetten.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Martijn Wieringa
Martijn Wieringa
19 jaar geleden
 
0 +1 -0 -1
Wat me opvalt is dat je nederlandse variabele namen en functie namen gebruikt. Dit zou ik zo snel mogelijk proberen af te leren. Zo blijft de code voor elke programmeur toegankelijk.. engels is toch een beetje de hoofdtaal in de programmeerwereld (binnen en buitenlnd). Commentaar liefste ook in het engels.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. class-file-uploader

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.