Een hosting-site voor bestanden maken met CodeIgniter

Ik heb een paar inleidende tutorials voor Codeigniter gezien en hoopte je iets geavanceerder te laten zien. Deze tutorial laat je zien hoe je een krachtige web-applicatie kunt bouwen voor het hosten van afbeeldingen, met behulp van de flexibiliteit van Codeigniter. Deze tutorial zou je moeten leren over de MVC-codeerfilosofie, die integraal deel uitmaakt van het produceren van bruikbare applicaties.


Stap 1: Setup

Voordat we ergens in de buurt van de code gaan, moeten we een aantal stappen zetten. Start uw favoriete database-editor (ik gebruik SQLBuddy) en maak een nieuwe database met de naam 'uploadr'. Maak hierin twee tabellen: 'gebruikers' en 'bestanden'. Stel gebruikers in om een ​​primaire-sleutel, automatisch genummerde 'id' kolom te hebben, samen met twee varchar-kolommen: 'wachtwoord' en 'gebruikersnaam'. De bestandstabel heeft een andere 'id' kolom nodig (opnieuw primaire sleutel en automatisch genummerd), evenals een integer 'eigenaar' kolom en een varchar 'naam' kolom.

Omdat deze tutorial is gericht op het leren programmeren van Codeigniter en op MVC, gaan we alle stylingdingen (zoals CSS, photoshop) de rug toekeren. Hiertoe heb ik een aangepaste Codeigniter-installatie voor u gemaakt, met alle gemaakte bestanden en de weergaven (meestal) HTML-d en CSS-d. De twee dingen die u moet wijzigen, zijn de configuratie- en database-instellingen. Ik heb zelfs een "Beta" -stempel toegevoegd, zodat het nog meer als een web-startup zou voelen!

Stap 2: Registratie

Nu op het eerste stukje vlees! Open de 'login.php' -controller en maak een functie met de naam 'registreren'. Dit gaat het volledige registratieproces controleren. Eerst moeten we controleren of POST-aanvragen naar de server zijn verzonden. In dit geval betekent dit dat iemand probeert zich te registreren. We kunnen dit doen door te controleren of $ _POST ['gebruikersnaam'] is ingesteld. Als dat zo is, weten we dat iemand heeft geprobeerd zich te registreren en het in de database kan invoeren.

 function register () if (isset ($ _ POST ['gebruikersnaam'])) // De gebruiker heeft geprobeerd te registreren, deze in de database in te voegen. $ gebruikersnaam = $ _POST ['gebruikersnaam']; $ wachtwoord = $ _POST ['wachtwoord']; $ this-> users-> register ($ gebruikersnaam, $ wachtwoord); redirect ( 'login');  else // Gebruiker heeft niet geprobeerd zich te registreren, registratiegegevens te vermelden. $ This-> load-> weergave ( 'registreren'); 

Als de gebruiker zich nog moet proberen te registreren, detecteert deze deze en verzendt deze automatisch naar de 'register'-weergave die ik voor u heb gecodeerd. Je zult de lijn opmerken:

$ This-> Gebruikers-> register ($ username, $ password);

Dit roept de functie 'register' op in het model 'gebruikers'. Op dit moment werkt dit niet, omdat we het model niet hebben geladen. We doen dit op dezelfde manier als het laden van views, maar omdat we dit model uitgebreid in deze klasse gaan gebruiken, laden we het in de constructorfunctie (de functie met dezelfde naam als de class), zodat het is altijd geladen en beschikbaar:

functie Login () parent :: Controller (); $ This-> load-> model ( 'gebruikers'); 

U bent waarschijnlijk geïnteresseerd in wat de registratiefunctie daadwerkelijk bevat. Welnu, het gebruikt eenvoudig een paar van de actieve opnamefuncties van Codeigniter, die DB-manipulatie mogelijk maken. Het grote voordeel van het gebruik van de ingebouwde actieve opnamefuncties van Codeigniter (naast het feit dat ze leuk en eenvoudig zijn) is dat ze database-agnostisch zijn: je kunt gemakkelijk verschillende databasetypen (bijvoorbeeld mySQL, SQLite) in en uit schakelen. DB-configuratiebestand zonder de toepassing te beïnvloeden. In het geval van onze registratie voegen we een vermelding toe aan de gebruikerstabel. Maak deze functie in het 'users.php'-model:

functieregister ($ gebruikersnaam, $ wachtwoord) $ new_user = array ('gebruikersnaam' => $ gebruikersnaam, 'wachtwoord' => $ wachtwoord); $ this-> db-> insert ('gebruikers', $ nieuwe_user); geef waar terug; 

Het enige dat het vermelden waard is in de registratieweergave zijn de functies site_url () en base_url (). Deze geven respectievelijk de URL van uw site met en zonder de index.php / suffix. Het grootste voordeel voor hen is dat u de URL-structuur van uw site kunt wijzigen zonder alle links te hoeven doorlopen: er is slechts één wijziging in uw configuratiebestand nodig.

Zodra dit allemaal is ingesteld, kunnen we proberen een account te registreren. De functie in onze controller moet ons opnieuw omleiden naar de inlogpagina nadat ons account is aangemaakt.

Stap 3: Inloggen

Nu we een paar gebruikers hebben ingesteld, hebben we een manier nodig om ze daadwerkelijk op de site te laten. Hiervoor gaan we de sessieklasse van Codeigniter gebruiken. Hoewel dit eigenlijk cookies gebruikt, werkt het op een vergelijkbare manier als normale PHP-sessies, alleen met meer opties (ik raad u aan de userguide te controleren).

Om te beginnen moeten we de functie maken waarnaar de inlogknop momenteel verwijst, 'go'. Deze functie moet de informatie verzamelen die het formulier heeft ingediend, en het dan vergelijken met de DB met behulp van een model. Als alles correct is, start het een sessie en wordt de gebruiker doorgestuurd naar zijn bestanden. Als ze hun gegevens verkeerd hebben getypt, worden ze omgeleid naar de inlogpagina.

functie go () $ gebruikersnaam = $ _POST ['gebruikersnaam']; $ wachtwoord = $ _POST ['wachtwoord']; // Retourneert userid indien succesvol, false indien niet succesvol $ results = $ this-> users-> login ($ gebruikersnaam, $ wachtwoord); if ($ results == false) redirect ('login'); else $ this-> session-> set_userdata (array ('userid' => $ results)); redirect ( 'profiel'); 

Delen van deze functie zouden u heel bekend uit de registerfunctie moeten zien: het verzamelt $ gebruikersnaam en $ wachtwoord, alvorens ze naar een model te sturen (dit keer 'inloggen'). Hierna echter beginnen de verschillen te ontstaan.

Vervolgens wordt gecontroleerd of de aanmelding is mislukt; als dat het geval is, wordt de gebruiker teruggeleid naar de inlogpagina. Als de login echter succesvol is, maakt het script een sessie en stelt het gebruikersid in op 'userid'. Alles wat we nu nodig hebben om het inlogscript te laten werken, is het model. Voeg deze functie toe aan het 'gebruikers'-model dat we eerder hebben gebruikt:

functie login ($ gebruikersnaam, $ wachtwoord) $ query = $ this-> db-> get_where ('users', array ('gebruikersnaam' => $ gebruikersnaam, 'wachtwoord' => $ wachtwoord)); if ($ query-> num_rows () == 0) return false; else $ result = $ query-> result (); $ first_row = $ resultaat [0]; $ userid = $ first_row-> id; return $ userid; 

Een snel overzicht: ten eerste vraagt ​​het de database op zoek naar gebruikers met exact dezelfde gebruikersnaam en hetzelfde wachtwoord. Als er geen wordt gevonden, is het aantal rijen 0 en retourneert de functie false. Als iemand is gevonden, gebruikt het een andere van de actieve opnamefuncties van Codeigniter om het als een object te laden. Deze objecten worden weergegeven als een reeks DB-rijen, die elk een object met die rij-informatie bevatten. Omdat we de eerste en enige rij willen, halen we het uit het $ resultaat en retourneren we het ID ervan.

We moeten controleren of de gebruiker is ingelogd op de profielpagina. Om dit te doen, voegen we eenvoudig twee regels code in de constructor van de profielcontroller in. Hiermee wordt gecontroleerd of de sessie een userid bevat. Als dit niet het geval is, gaat u door naar de inlogpagina. Als dat zo is, dan is alles in orde en wordt het omgezet in een publieke variabele. Terwijl we de constructor veranderen, laden we de twee modellen die we nodig hebben voor de profielpagina:

function Profile () parent :: Controller (); $ This-> load-> model ( 'gebruikers'); $ This-> load-> model ( 'files'); $ this-> userid = $ this-> session-> userdata ('userid'); if (! isset ($ this-> userid) of $ this-> userid == ") redirect ('login');

Het laatste wat we moeten doen, is het mogelijk maken om uit te loggen. Dit wordt bereikt door simpelweg het userid in te stellen op niets, het te verwijderen. Het enige dat nodig is, is een eenvoudige functie:

functie logout () $ this-> session-> set_userdata (array ('userid' => ")); redirect ('login');

Stap 4: bestanden bekijken en uploaden

Op dat moment hebben we net voor de eerste keer ingelogd. Waarmee worden we begroet??

Niet slecht, niet slecht, hoewel dat 'voorbeeldbestand' niet uit onze database wordt gegenereerd, is het statisch. We zullen dat snel corrigeren, maar eerst moeten we de rechten van de map 'bestand' wijzigen, zodat Codeigniter het kan lezen en erop kan schrijven. Ik veranderde het in 777 Toestemmingen:

Nu dat uit de weg is, laten we teruggaan naar wat codering! We moeten alle gebruikersbestanden uit de database laden en daarvoor hebben we nodig ...

… een model! Deze keer gaan we het echter maken in het 'files.php'-model, dus we houden onze gebruikerstabel en bestandstabel gescheiden. Voer deze functie in:

functie get ($ userid) $ query = $ this-> db-> get_where ('files', array ('owner' => $ userid)); return $ query-> result (); 

Dit komt weer terug uit eerdere delen van deze tutorial, dus je zou het moeten kunnen begrijpen. In principe krijgt het alle rijen waar de eigenaar = de ID van de gebruiker, en geeft deze terug in een mooie reeks objecten. Laten we iets maken in de 'profielen'-controller om ermee te communiceren en de informatie door te geven aan de weergave. Wijzig de indexfunctie als volgt:

function index () $ data ['files'] = $ this-> bestanden-> get ($ this-> userid); $ this-> load-> view ('profile', $ data); 

Nogmaals, een zeer eenvoudige functie. Het neemt de resultaten die eraan zijn doorgegeven uit het bestandsmodel en verpakt ze in de weergave. Codeigniter geeft gegevens meestal door aan de weergave via een array (in dit geval gegevens). Het zal dan de array automatisch ontploffen in een groot aantal variabelen, dus wanneer we naar de weergave gaan, zal het in staat zijn om toegang te krijgen tot de database resultaten via $ file in plaats van $ data ['file']. Laten we dit mooie databaseresultaat in het zicht plaatsen! Plaats dit in 'profile.php' en vervang de code waarnaar de HTML-opmerking verwijst.

 
naam?>
bestanden /naam?> "> View id)?> "> Verwijder

De foreach-lus laadt elke rij van de array om beurten en maakt deze toegankelijk via het object $ file. Vervolgens vullen we, met behulp van de voorbeeldsectie "als sjabloon", alle links en de naam in met informatie voor het nieuwe $ -bestand-object. We zullen later bekijken hoe de verwijderfunctie werkt en hoe de kijkkoppeling werkt nadat we iets hebben geüpload.

Als u dit nu in uw browser opent, ziet u niets. Dit komt omdat we geen bestanden hebben geüpload! Dat moeten we rechtzetten, dus we moeten een uploadformulier maken. Laten we eerst de controller doen; open 'profile.php' en voeg deze functie toe:

function upload () if (isset ($ _ FILES ['file'])) $ file = read_file ($ _ FILES ['file'] ['tmp_name']); $ name = basename ($ _ FILES ['file'] ['name']); write_file ('files /'.$ naam, $ bestand); $ This-> bestanden-> toe te voegen ($ name); redirect ( 'profiel');  else $ this-> load-> view ('upload'); 

Deze functie voegt een aantal nieuwe dingen toe: met name de bestandsafhandeling van Codeigniter. Het begint vrij eenvoudig en controleert of een formulier is verzonden door naar een bestand te zoeken. Als het bestand niet bestaat, toont het eenvoudig de uploadweergave (die we hierna zullen bijwerken). Als het bestand bestaat, leest het uittreksels het tijdelijke bestand dat de server heeft gegenereerd. De map van het tijdelijke bestand is te vinden op $ _FILES ['jouw bestand'] [' tmp_name '], en het bestand kan worden gelezen uit deze map door Codeigniter's read_file. Hiermee laadt u alle bestandsinformatie in de variabele $ file.

De volgende regel krijgt de bestandsnaam van de globale $ _FILES op een vergelijkbare manier als het ophalen van de tijdelijke map. Gewapend met deze twee stukjes informatie schrijft codeigniter het bestand naar de map met bestanden in dezelfde map als het indexbestand. Ten slotte moet het bestand aan de database worden toegevoegd. Nogmaals, we gaan dit met een model, ditmaal de 'add'-functie in' bestanden '. We zullen zien hoe dat werkt in een paar minuten, maar we moeten nu het uploadformulier in de weergave maken. Voeg dit toe waar de HTML-reactie van 'upload.php' aangeeft dat je:

Het dossier:

Controleer voordat u gaat uploaden

de Servicevoorwaarden.


Vervang de huidige HTML hiermee. Het belangrijkste om op te merken is dat we bij het uploaden van bestanden een input type = bestand gebruiken, waarmee we een bestand kunnen kiezen om te uploaden. We moeten ook een enctype in onze formuletag specificeren, zodat de server weet dat het een bestand ontvangt en opslaat. Niet zo interessant voor ons back-end coders, maar toch cruciaal! Laten we snel kijken naar wat we hebben gemaakt:

Nu gaan we naar het laatste deel van het script voor het uploaden van bestanden, het model. Hiermee wordt het bestand toegevoegd aan de database, met de naam en eigenaar, zodat de server weet welke bestanden bij wie horen. Laten we kijken; voeg dit toe aan uw 'bestanden'-model:

functie add ($ file) $ this-> db-> insert ('files', array ('owner' => $ this-> session-> userdata ('userid'), 'name' => $ file)) ; 

Opnieuw gebruikmakend van de actieve recordfunctionaliteit van Codeigniter, voegen we een rij toe aan de database met de naam van het bestand en de eigenaar. We krijgen de eigenaar door de id van de gebruiker te vinden op basis van de sessiegegevens die we eerder hebben opgeslagen bij het aanmelden. Al met al een heel eenvoudige functie. Laten we proberen een mooie foto te uploaden, eh?

En voila!

Als we in de map 'bestanden' kijken, zien we dat het bestand dat we hebben geüpload daar als bij toverslag is verschenen (Codeigniter magic!) En we zien waarom de weergavelink werkt, omdat het eenvoudigweg verwijst naar het bestand in de map. . Als dit is gebeurd, is het enige dat nog overblijft voor deze zelfstudie het verwijderen van bestanden.

Stap 5: Bestanden verwijderen

Ok, het laatste stukje. Dit zou niet zo lang moeten duren, omdat je de ideeën die je eerder hebt geleerd, kunt gebruiken om dit te begrijpen. Eerst voegen we deze code toe aan onze 'profielen'-controller:

function delete ($ id) // Hiermee verwijdert u het bestand uit de database voordat u de naam van het bestand retourneert. $ name = $ this-> bestanden-> delete ($ id); ontkoppelen ( 'files /'.$ naam); redirect ( 'profiel'); 

En deze code voor ons 'bestanden'-model:

function delete ($ fileid) $ query = $ this-> db-> get_where ('files', array ('id' => $ fileid)); $ result = $ query-> result (); $ query = $ this-> db-> delete ('files', array ('id' => $ fileid)); return $ result [0] -> naam; 

De eerste controller moet heel gemakkelijk te begrijpen zijn. Het roept de verwijderfunctie op uit het bestandsmodel (dat we op hetzelfde moment hebben gedefinieerd), waarmee de naam van het bestand wordt gegenereerd. Vervolgens wordt een basis-PHP-functie gebruikt om het bestand met die naam in de bestandsmap te verwijderen. Ten slotte wordt het teruggestuurd naar het gebruikersprofiel (dat nu min één bestand is).

Het model is iets complexer. Het moet de naam van het bestand retourneren en verwijderen, dus eerst wordt de database bevraagd om de details van de bestanden op te halen. Het laadt dit in de variabele $ result en gaat vervolgens door met het verwijderen van het bestand. Vervolgens wordt de kolom 'naam' van de eerste rij van de array geretourneerd (de enige rij die is geretourneerd), die vervolgens wordt gebruikt in de bovenstaande controller.

Laten we proberen een functie te verwijderen:

En klik op verwijderen ...

Hoera! Het werkte. Ik denk dat we dan allemaal klaar zijn!

Laatste gedachten

Verwijder bestanden

Natuurlijk moet deze code niet op een server worden uitgevoerd zonder serieuze verbeteringen. Hier zijn een paar grote problemen mee:

  • De wachtwoorden zijn allemaal niet-versleuteld. Dit betekent dat als iemand inbreekt in uw database, zij met minimale moeite al uw gebruikersgegevens kunnen stelen. Zoals ik zeker ben, zullen jullie het allemaal met elkaar eens zijn: niet goed. Dit kan gemakkelijk worden opgelost door een eenvoudige hashing toe te voegen aan de wachtwoorden.
  • De bestanden zijn niet privé. Het kan zijn dat een gebruiker ervoor wil zorgen dat de bestanden die ze uploaden alleen zichtbaar zijn voor hen, en niet voor iemand die gewoon een heleboel urls raad. Dit zou waarschijnlijk een andere controller vereisen voor het bedienen van de bestanden (die controleert op sessiegegevens).
  • Het script controleert niet of er bestanden zijn voordat bestanden worden geschreven. Dit kan conflicten met uw bestanden veroorzaken, of dit kan ertoe leiden dat bestandsgegevens worden overschreven. Wat dan ook: niet goed. Dit kan worden opgelost met een eenvoudige DB-controle om ervoor te zorgen dat het bestand niet is genomen en kan worden geminimaliseerd door gebruikers hun eigen mappen in de map met bestanden te geven.
  • Er worden geen fouten gegenereerd. Dit helpt de gebruiker niet precies te achterhalen wat ze verkeerd doen, en hoewel dit op een dergelijke kleine site met dergelijke beperkte acties niet (te) veel problemen oplevert, kan het toch nog worden verbeterd.

Al met al heb je een behoorlijk krachtige kleine webapplicatie gemaakt, vooral vanwege de kleine hoeveelheid code die je moest schrijven. Vanwege de aard van Codeigniter is het vrij eenvoudig uit te breiden, zowel om de bovenstaande problemen op te lossen, als om nieuwe functies toe te voegen, zoals het hernoemen van bestanden. Ik hoop ook dat deze tutorial je iets heeft geleerd over het gebruik van MVC-concepten en de kracht die ze bieden: door simpelweg de modellen in onze applicatie aan te passen, kunnen we onze DB voor tekstbestanden, XML of wat dan ook ruilen en door de weergaven te veranderen , we kunnen volledig opnieuw thema's maken zonder de functionaliteit te onderbreken. Verbazingwekkend!

  • Abonneer u op de NETTUTS RSS-feed voor meer dagelijkse webontwikkelingen, tuts en artikelen.