Hoe Amazon S3 en PHP te gebruiken om bestanden dynamisch op te slaan en te beheren

Een paar weken geleden plaatste Nettuts + een inleidende tutorial over het gebruik van Amazon's Simple Storage System (S3). Het is geweldig om een ​​onbeperkt aantal bestanden te kunnen uploaden voor bijna geen geld, maar het zou nog beter zijn als uw gebruikers bestanden van uw website zouden kunnen uploaden. Op die manier hoef je je geen seconde zorgen te maken over de grootte van je webserver. Laten we proberen!

Wat we in principe gaan doen, is een standaard HTML-bestandselement en een eenvoudig te gebruiken S3 PHP-klasse gebruiken om een ​​pagina te maken waarop mensen een bestand naar uw S3-account kunnen uploaden en informatie kunnen krijgen over de bestanden die al zijn geüpload. Hiervoor heb je een Amazon S3-account en een PHP-enabled webserver nodig. Als je nog nooit van Amazon S3 hebt gehoord, of je hebt nog geen account, lees eerst Collis 'Introductory S3 Tutorial.

Stap 1

Het eerste dat we nu nodig hebben, is een manier waarop PHP kan communiceren met de S3-server. Donovan Schonknecht heeft hiervoor een PHP-klasse geschreven, dus in plaats van het wiel opnieuw uit te vinden, gebruiken we dat!

  1. Download de 'nieuwste bètaversie (0.2.3)'
  2. Pak het .rar-bestand uit en kopieer het S3.php-bestand naar een nieuwe map. Het bestand wordt geleverd met een leesmij en een paar voorbeelden, maar we zullen deze niet gebruiken.
  3. Open het S3.php-bestand en kijk rond om al het werk te zien dat je zelf niet gaat doen dankzij deze les! :-)

Stap 2

Maak vervolgens een nieuw bestand met de naam page.php in dezelfde map. Het eerste dat we moeten doen is het S3.php-bestand opnemen. We zullen de require_once () functie gebruiken in php. Deze functie zal het bestand alleen bevatten als het niet eerder op dezelfde pagina was opgenomen. Dit is om ervoor te zorgen dat we geen problemen ondervinden met functie-herdefinities wanneer het script per ongeluk probeert het bestand een tweede keer op te nemen.

Vervolgens moeten we toegang krijgen tot de Amazon Web Services (AWS) toegangsinformatie die het script nodig heeft om toegang te krijgen tot onze S3-server. Dit zijn de toegangssleutel en de geheime sleutel die wordt aangeboden door Amazon (nogmaals, als je niet weet waar ik het over heb, zie dan de inleidende NETTUTS-tutorial). Nu hebben we alle informatie die nodig is om de klas te initiëren. Deze code stond bovenaan de lijst lichaam labels.

 

Stap 3

Laten we nu een eenvoudige html-vorm maken met een bestandselement erin. Met dit element kunnen gebruikers op hun lokale station naar een bestand bladeren. Wanneer de gebruiker op de verzendknop drukt, wordt het bestand automatisch als een tijdelijk bestand naar de server geüpload en wordt er informatie over het bestand verzonden in de POST-variabele.

Hier is het codefragment. Vergeet niet te vergeten enctype = "multipart / form-data" die nodig is om het bestandselement te laten werken. Deze code moet buiten de tags, omdat het HTML is.

 

Stap 4

Nu voor degenen die onfeilbaar zijn met vormen, action = "" vertelt het script naar welke pagina moet worden doorgegaan. Omdat we daar een lege string hebben opgegeven, plaatst het formulier de variabelen en vernieuwt dan de huidige pagina. Dus wanneer de pagina wordt geladen, willen we controleren of een formulier is verzonden. Wanneer een formulier is verzonden, moet de pagina het script uitvoeren dat de postvariabelen bevat en ervoor zorgt dat de bestanden naar de S3-server worden verplaatst.

De variabele post die door het bestandelement wordt verzonden, is een array met informatie over het bestand. Bijvoorbeeld: bestandsnaam, grootte, type en tijdelijke naam. We hebben alleen de bestandsnaam en de tijdelijke naam nodig. Merk op dat, in tegenstelling tot andere formulierelementen, het bestandselement de variabelen naar stuurt $ _FILES en niet aan $ _POST.

De PHP-code hieronder controleert of een formulier is ingediend en geeft de postvariabelen weer. We zullen later met de S3-server omgaan. Deze code moet worden geplaatst direct nadat we de s3-klasse hebben geïnitieerd.

 // controleer of een formulier is verzonden als (isset ($ _ POST ['Submit'])) // post variabelen retourneren $ fileName = $ _FILES ['theFile'] ['name']; $ fileTempName = $ _FILES ['theFile'] ['tmp_name']; // we gaan door met ons script van hier in de volgende stap! 

Stap 5

Oké, dus nu hebben we een formulier dat een tijdelijk bestand naar de server stuurt en wat informatie achterlaat. Als u wilt, kunt u het bestand naar een server uploaden en testen. U zult merken dat het inderdaad enige tijd kost om het formulier te verwerken, omdat het in feite een bestand is. Hoe dan ook, u ziet het bestand nergens op uw server verschijnen omdat het alleen als tijdelijk bestand werd opgeslagen. Het enige dat u hoeft te doen, is door ons geüploade bestand naar een bucket te verplaatsen. Eerst maken we een nieuwe bucket en vervolgens verplaatsen we het bestand naar die bucket.

Om een ​​bucket te maken, gebruiken we de functie putBucket (emmer, acl) waarin 'bucket' de naam van de bucket is (Amazon's woord voor je hoofdmap of map met bestanden). Het tweede argument is de toegangscontrolelijst (ACL) waarin u kunt definiëren wie wel en wie niet kan lezen van of naar deze bucket kan schrijven. We willen dat iedereen onze bestanden kan lezen, dus gebruiken we S3 :: ACL_PUBLIC_READ. Merk op dat een bucket maar één keer hoeft te worden aangemaakt, dus elke keer dat dit script wordt uitgevoerd, doet deze functie niets, omdat de bucket al bestaat.

Om het bestand te verplaatsen, gebruiken we de functie putObjectFile (bronbestand, bucket, nieuwe bestandsnaam, acl).Het bronbestand is het pad naar het bestand dat we willen verplaatsen, dus in ons geval is dit het tijdelijke bestand dat is geüpload via ons formulier. De emmer is de emmer om het bestand naar toe te verplaatsen, wat de emmer is die we zojuist hebben gemaakt. Newfilename is de bestandsnaam die het bestand in de bucket zal krijgen. In deze zelfstudie gebruiken we dezelfde bestandsnaam als op de lokale schijf, maar in sommige gevallen wilt u mogelijk bestandsnamen wijzigen. Acl is opnieuw de toegangscontrolelijst, die we opnieuw zullen instellen op S3 :: ACL_PUBLIC_READ.

 // maak een nieuwe bucket $ s3-> putBucket ("jurgens-nettuts-tutorial", S3 :: ACL_PUBLIC_READ);

// verplaats het bestand als ($ s3-> putObjectFile ($ fileTempName, "jurgens-nettuts-tutorial", $ fileName, S3 :: ACL_PUBLIC_READ)) echo "We hebben uw bestand succesvol geüpload."; else echo "Er is iets misgegaan tijdens het uploaden van je bestand ... sorry.";

Stap 6

Wanneer u nu een bestand selecteert en op 'Upload' klikt, wordt het bestand opgeslagen op de Amazon-server. U kunt het al bekijken door een URL in te voeren die er als volgt uitziet: http: //yourbucketname.s3.amazoneaws.com/yourfile.ext

Voor de finishing touch willen we dat het script een lijst met bestanden in de bucket uitvoert. Hiervoor gebruiken we de functie getBucket (bak), in welke emmer de emmer is die we willen uitvoeren. Deze functie retourneert een array met informatie over de bestanden. Elk geretourneerd als een array, ook. Visualiseren:

We willen elk bestand in de array $ bucket_contents uitvoeren. Hiervoor gebruiken we een foreach () lus die door de array loopt totdat alle elementen zijn verwerkt. Het zal het huidige element in de variabele $ file opslaan en de code tussen de haakjes uitvoeren. Alles wat we nu moeten doen is een echo van een link naar het bestand.

Plaats deze code onder het formulier om de lijst daar te tonen.

 getBucket ( "Jurgens-nettuts-handleiding"); foreach ($ bucket_contents als $ bestand) $ fname = $ file ['name']; $ furl = "http://jurgens-nettuts-tutorial.s3.amazonaws.com/".$fname; // output een link naar het bestand echo "$ fname
";?>

Met een kleine CSS-styling ziet uw eindresultaat er als volgt uit:

Afgewerkt!

Dus daar heb je het, je eigen onbeperkte bestandsuploadscript. Natuurlijk kun je nog veel meer doen met de S3 PHP-klasse. Neem een ​​snelle blik op het leesmij-bestand en je bent klaar om te gaan. Het is echt gemakkelijk te gebruiken!

Download de bronbestanden

Bekijk een demo