För några veckor sedan lade Netuts + en introduktion till användningen av Amazons enkla lagringssystem (S3). Att kunna ladda upp ett obegränsat antal filer för knappast några pengar är bra, men det skulle bli ännu bättre om dina användare skulle kunna ladda upp filer från din webbplats. På det sättet skulle du inte behöva oroa dig för storleken på din webbserver för en sekund. Låt oss försöka!
I grund och botten vad vi ska göra är att använda ett standard HTML-filelement och en lättanvänd S3 PHP-klass för att skapa en sida där människor kan ladda upp en fil till ditt S3-konto och få information om de filer som redan har laddats upp. För detta behöver du ett Amazon S3-konto och en PHP-aktiverad webbserver. Om du inte har hört talas om Amazon S3, eller om du inte har ett konto än, läs Collis Inledande S3 Tutorial först.
Nu är det första som vi behöver för PHP att kommunicera med S3-servern. Donovan Schonknecht har skrivit en PHP-klass för detta, så istället för att försöka uppfinna hjulet, använder vi det!
Gör sedan en ny fil som heter page.php i samma mapp. Det första vi behöver göra är att inkludera filen S3.php. Vi använder funktionen require_once () i php. Den här funktionen kommer endast att innehålla filen om den inte inkluderades tidigare på samma sida. Det här är för att säkerställa att vi inte kommer att lösa några problem med funktionen omdefinitioner när det går att försöka inkludera filen en gång till.
Därefter måste vi ange informationen för Amazon Web Services (AWS) som skriptet behöver åtkomst till vår S3-server. Dessa är Acces Key och den hemliga nyckeln som tillhandahålls av Amazon (igen, om du inte vet vad jag pratar om, se den inledande NETTUTS handledningen). Nu har vi all information som behövs för att initiera klassen. Denna kod placerades längst upp i kropp taggar.
Låt oss nu göra en enkel HTML-form med ett filelement i det. Detta element tillåter användare att bläddra i sin lokala enhet för en fil. När användaren trycker på inmatningsknappen laddas filen automatiskt som en tillfällig fil till servern och information om filen kommer att skickas i POST-variabeln.
Här är kodbiten. Var noga med att inte glömma enctype = "multipart / form-data" vilket är nödvändigt för att filelementet ska fungera. Denna kod ska placeras utanför taggar, eftersom det är HTML.
Nu, för dem unfamilliar med former, action = "" berättar manuset vilken sida ska gå till efter inlämning. Eftersom vi har angett en tom sträng där kommer formuläret att posta variablerna och sedan uppdatera den aktuella sidan. Så när sidan laddas, vill vi kolla huruvida en blankett skickades in. När en blankett skickades ska sidan utföra skriptet som återställer postvariablerna och tar hand om att flytta filerna till S3-servern.
Postvariabeln som skickas av filelementet är en array som innehåller information om filen. Till exempel: filnamn, storlek, typ och tillfälligt namn. Allt vi behöver är filnamnet och det tillfälliga namnet. Observera att, till skillnad från andra formelement, skickar filelementet variablerna till $ _FILES och inte till $ _POST.
PHP-koden nedan kontrollerar huruvida en blankett skickades in och återställer postvariablerna. Vi tar hand om S3-servern senare. Denna kod ska placeras strax efter där vi initierade s3-klassen.
// kontrollera om en blankett skickades om (isset ($ _ POST ['Submit'])) // retreive post variabler $ fileName = $ _FILES ['theFile'] ['name']; $ fileTempName = $ _FILES ['theFile'] ['tmp_name']; // vi fortsätter vårt skript härifrån i nästa steg!
Ok, så nu har vi ett formulär som skickar en temporär fil till servern och lämnar dig med lite information. Om du vill kan du ladda upp filen till en server och testa den. Du märker att det verkligen tar lite tid att bearbeta formuläret, eftersom det faktiskt laddar upp en fil. Hur som helst kommer du inte att se filen visas någonstans på din server eftersom den bara sparades som en tillfällig fil. Allt som finns kvar är att flytta vår uppladdade fil till en hink. Först ska vi skapa en ny hink och sedan flyttar vi filen till den hinken.
För att skapa en hink använder vi funktionen putBucket (hink, acl) i vilken "hink" är hinkens namn (Amazons ord för din huvudmapp eller katalog över filer). Det andra argumentet är åtkomstkontrolllistan (ACL) där du kan definiera vem som kan och vem inte kan läsa från eller skriva till den här hinken. Vi vill att någon ska kunna läsa våra filer, så vi använder S3 :: ACL_PUBLIC_READ. Observera att en hink bara behöver skapas en gång, så varje gång det här skriptet körs kommer den här funktionen inte att göra något, eftersom skopan redan finns.
För att flytta filen använder vi funktionen putObjectFile (sourcefile, bucket, newfilename, acl).Sourcefile är sökvägen till filen vi vill flytta, så i vårt fall är det den temporära filen som laddades upp via vår blankett. Skopa är skopan för att flytta filen till, vilket kommer att bli den skopa vi just skapat. Newfilename är filnamnet filen kommer att få i hinken. I den här handledningen använder vi samma filnamn som på den lokala enheten, men i vissa fall kanske du vill ändra filnamn. Acl igen är Access Control List, som vi igen ställer in till S3 :: ACL_PUBLIC_READ.
// skapa en ny hink $ s3-> putBucket ("jurgens-netuts-tutorial", S3 :: ACL_PUBLIC_READ);
// flytta filen om ($ s3-> putObjectFile ($ fileTempName, "jurgens-netuts-tutorial", $ fileName, S3 :: ACL_PUBLIC_READ)) echo "Vi har laddat upp din fil."; else echo "Något gick fel när du laddade upp din fil ... förlåt.";
Nu när du väljer en fil och klickar på "Ladda upp" sparas filen på Amazon-servern. Du kan redan se det genom att ange en webbadress som ser ut så här: http: //yourbucketname.s3.amazoneaws.com/yourfile.ext
För den slutliga kontakten vill vi att skriptet ska mata ut en lista med filer i hinken. Därför använder vi funktionen getBucket (skopa), i vilken hink är skopan vi vill producera. Den här funktionen returnerar en matris med information om filerna. Var och en återvände också som en matris. Att visualisera:
Vi vill skriva ut varje fil i $ bucket_contents-arrayen. För detta använder vi en för varje() slinga som kommer att slingas genom matrisen tills alla element har bearbetats. Den lagrar det aktuella elementet i $ -filvariabeln och kör koden mellan parenteserna. Allt vi behöver göra nu är echo en länk till filen.
Placera denna kod under formuläret för att visa listan där.
getBucket ( "Jurgens-nettuts-tutorial"); foreach ($ bucket_contents as $ file) $ fname = $ fil ['namn']; $ furl = "http://jurgens-nettuts-tutorial.s3.amazonaws.com/".$fname; // mata ut en länk till filen echo "$ fname
";?>
Med en liten css-styling kan ditt slutresultat se ut så här:
Så där har du det, ditt eget obegränsat filuppladdningsskript. Självklart finns det mycket mer du kan göra med S3 PHP-klassen. Ta en snabb blick på readme-filen och du kommer att vara bra att gå. Det är verkligen lätt att använda!
Ladda ner källfilerna
Visa en demo