Slik bruker du Amazon S3 og PHP til å lagre og administrere filer på en dynamisk måte

For noen uker siden skrev Nettuts + en introduksjonsveiledning til bruk av Amazons Simple Storage System (S3). Å kunne laste opp et ubegrenset antall filer for knapt noen penger er bra, men det ville være enda bedre hvis brukerne dine kunne laste opp filer fra nettstedet ditt. På den måten trenger du ikke å bekymre deg for størrelsen på webserveren din i et sekund. La oss prøve!

I utgangspunktet hva vi skal gjøre er å bruke et standard HTML-filelement og en brukervennlig S3 PHP-klasse for å lage en side der folk kan laste opp en fil til din S3-konto og få informasjon om filene som allerede er lastet opp. For dette trenger du en Amazon S3-konto og en PHP-aktivert webserver. Hvis du ikke har hørt om Amazon S3, eller du ikke har en konto enda, les Collis 'Introductory S3 Tutorial først.

Trinn 1

Nå, det første vi trenger er en måte for PHP å kommunisere med S3-serveren. Donovan Schonknecht har skrevet en PHP klasse for dette, så i stedet for å prøve å gjenoppfinne hjulet, bruker vi det!

  1. Last ned den nyeste beta-versjonen (0.2.3) '
  2. Trekk ut .rar-filen og kopier S3.php-filen til en ny mappe. Filen leveres med readme og noen få eksempler, men vi vil ikke bruke disse.
  3. Åpne S3.php-filen og ta en titt bare for å se alt arbeidet du ikke skal gjøre selv takket være denne klassen! :-)

Steg 2

Deretter lag en ny fil som heter page.php i samme mappe. Første ting vi trenger å gjøre er å inkludere S3.php-filen. Vi bruker funksjonen require_once () i php. Denne funksjonen vil bare inneholde filen hvis den ikke var inkludert før på samme side. Dette er for å sikre at vi ikke kommer til å løse noen problemer med funksjonen omdefinisjoner ved et uhell forsøker skriptet å inkludere filen en gang til.

Deretter må vi gå inn i Amazon Web Services (AWS) tilgangsinformasjonen som skriptet trenger for å få tilgang til vår S3-server. Dette er Acces-nøkkelen og den hemmelige nøkkelen som tilbys av Amazon (igjen, hvis du ikke vet hva jeg snakker om, se den innledende NETTUTS opplæringen). Nå har vi all den informasjonen som trengs for å starte klassen. Denne koden ble lagt inn i toppen av kropp tags.

 

Trinn 3

La oss nå lage et enkelt html-skjema med et filelement i den. Dette elementet lar brukerne bla gjennom sin lokale stasjon for en fil. Når brukeren trykker på send-knappen, lastes filen automatisk som en midlertidig fil til serveren, og informasjon om filen vil bli sendt i POST-variabelen.

Her er kodebiten. Pass på at du ikke glemmer enctype = "multipart / formdata" som er nødvendig for at filelementet skal fungere. Denne koden skal plasseres utenfor koder, siden det er HTML.

 

Trinn 4

Nå, for de unfamilliar med former, action = "" forteller skriptet hvilken side skal gå til etter innsending. Siden vi angav en tom streng der, vil skjemaet legge inn variablene og deretter oppdatere gjeldende side. Så når siden lastes inn, vil vi sjekke om et skjema ble sendt. Når et skjema ble sendt, skulle siden utføre skriptet som trekker opp postvariablene og tar seg av å flytte filene til S3-serveren.

Postvariabelen som sendes av filelementet er en matrise, som inneholder informasjon om filen. For eksempel: filnavn, størrelse, type og midlertidig navn. Alt vi trenger er filnavnet og det midlertidige navnet. Merk at, i motsetning til andre formelementer, vil filelementet sende variablene til $ _files og ikke til $ _POST.

PHP-koden nedenfor kontrollerer om et skjema ble sendt inn og gjenoppretter postvariablene. Vi skal behandle S3-serveren senere. Denne koden skal plasseres like etter hvor vi startet s3-klassen.

 // Sjekk om et skjema ble sendt hvis (isset ($ _ POST ['Submit'])) // retreive postvariabler $ fileName = $ _FILES ['theFile'] ['name']; $ fileTempName = $ _FILES ['theFile'] ['tmp_name']; // vi fortsetter skriptet vårt herfra i neste trinn! 

Trinn 5

Ok, så nå har vi et skjema som sender en midlertidig fil til serveren og gir deg litt informasjon. Hvis du vil, kan du laste opp filen til en server og teste den. Du vil legge merke til at det egentlig tar litt tid å behandle skjemaet, siden det faktisk laster opp en fil. Uansett vil du ikke se at filen vises hvor som helst på serveren din, fordi den bare ble lagret som en midlertidig fil. Alt som er igjen å gjøre, er å flytte vår opplastede fil til en bøtte. Først skal vi opprette en ny bøtte, og så flytter vi filen til den bøtte.

For å lage en bøtte bruker vi funksjonen putBucket (bøtte, acl) i hvilken "bøtte" er navnet på bøtte (Amazons ord for hovedmappen eller katalogen med filer). Det andre argumentet er tilgangskontrolllisten (ACL), der du kan definere hvem som kan og hvem ikke kan lese fra eller skrive til denne bøtte. Vi vil at noen skal kunne lese våre filer, så vi bruker S3 :: ACL_PUBLIC_READ. Legg merke til at en bøtte bare må opprettes en gang, så hver gang neste script utføres, vil denne funksjonen ikke gjøre noe, siden bøtte allerede eksisterer.

For å flytte filen bruker vi funksjonen putObjectFile (sourcefile, bøtte, newfilename, acl).Kildefilen er banen til filen vi vil flytte, så i vårt tilfelle er det den midlertidige filen som ble lastet opp gjennom vårt skjema. Bøtte er bøtte for å flytte filen til, som vil være bøtte vi nettopp har opprettet. Newfilename er filnavnet filen vil komme i bøtte. I denne opplæringen bruker vi samme filnavn som på den lokale stasjonen, men i enkelte tilfeller vil du kanskje endre filnavn. Acl igjen er tilgangskontrollisten, som vi igjen vil angi til S3 :: ACL_PUBLIC_READ.

 // lage en ny bøtte $ s3-> putBucket ("jurgens-nettuts-tutorial", S3 :: ACL_PUBLIC_READ);

// flytt filen hvis ($ s3-> putObjectFile ($ fileTempName, "jurgens-nettuts-tutorial", $ filnavn, S3 :: ACL_PUBLIC_READ)) echo "Vi lastet opp filen din."; else echo "Noe gikk galt under opplasting av filen din ... beklager.";

Trinn 6

Nå når du velger en fil og klikker 'Last opp', blir filen lagret på Amazon-serveren. Du kan allerede se det bare ved å skrive inn en nettadresse som ser slik ut: http: //yourbucketname.s3.amazoneaws.com/yourfile.ext

For sluttbehandling vil vi at skriptet skal sende ut en liste over filer i bøtte. For dette bruker vi funksjonen getBucket (bøtte), i hvilken bøtte er bøtte vi ønsker å sende ut. Denne funksjonen returnerer en matrise med informasjon om filene. Hver returnerte som en matrise også. Å visualisere:

Vi vil sende ut hver fil i $ bucket_contents-arrayet. For dette bruker vi en for hver() loop som vil løpe gjennom arrayet til alle elementer er behandlet. Den lagrer det nåværende elementet i $ fil-variabelen og kjører koden mellom brakettene. Alt vi trenger å gjøre nå er ekko en lenke til filen.

Legg denne koden under skjemaet for å vise listen der.

 getBucket ( "Jurgens-nettuts-veiledningen"); foreach ($ bucket_contents as $ file) $ fname = $ fil ['navn']; $ furl = "http://jurgens-nettuts-tutorial.s3.amazonaws.com/".$fname; // output en kobling til fil ekko "$ fname
";?>

Med en liten css-styling kan ditt endelige resultat se slik ut:

ferdig!

Så der har du det, ditt eget ubegrensede filopplastingskript. Selvfølgelig er det mye mer du kan gjøre med S3 PHP-klassen. Bare ta et raskt blikk på sin readme-fil, og du vil være god å gå. Det er veldig enkelt å bruke!

Last ned kildefilene

Se en demonstrasjon