Cum se construiește un încărcător S3 personalizat

V-ați întrebat vreodată cum să creați un formular care să poată încărca mai multe fișiere direct în galetul dvs. S3 dorit? În timp ce unelte precum S3Fox și Transmit cu siguranță fac treaba destul de bine, uneori avem nevoie de o interfață mai simplă, cu un singur clic pentru clienții noștri. Vom construi unul astăzi!


Produs final



Planul jocului

Să ne dăm mai întâi obiectivele.

Vrem să construim o pagină de încărcare simplă, care va oferi clienților / membrilor echipei capacitatea de a încărca mai multe fișiere (active) în contul nostru S3 cu un singur clic. Acest lucru va face procesul cât mai simplu posibil pentru ei și, de asemenea, vine cu bonusul de a restricționa accesul complet la contul nostru S3.


Pasul 1 - Nu reintroduceți roata

Când lucrați cu API, rețineți întotdeauna că ar fi mult mai avantajos să folosiți clasele existente, decât să pierdeți ore în timp ce revoluționați personal documentația API. Timpul tău este mai bine petrecut în altă parte. În plus, în plus, o clasă de wrapper testată pentru API-ul dorit va beneficia de mult mai multă teste și depanare.

Cu acest lucru în minte, vom folosi excelent Amazon S3 PHP Class. Continuați și descărcați fișierul zip și trageți directorul în rădăcina proiectului.


Pasul 2 - includeți clasa

Să începem să construim controlerul nostru simplu. Creaza un nou index.php fișier și adăugați:

 // Afișarea erorilor în timpul producției ini_set ('display_errors', 1); // include clasa S3 dacă (! class_exists ('S3')) require_once 's3 / S3.php'; 

Ne asigurăm mai întâi că toate erorile sunt afișate pe pagină în timpul producției.

Apoi, trebuie să includeți clasa Amazon S3 pe care am descărcat-o în primul pas. Se numește fișierul specific pe care îl solicităm S3.php. Acum ar trebui să fie incluse în proiectul nostru numai dacă S3 clasa nu există deja. Din punct de vedere tehnic, pe măsură ce avem control complet asupra acestor fișiere, puteți să eliminați acest cec, dar este încă o bună practică.


Full Screencast



Pasul 3 - Avertismentele AWS

Următorul pas este trecerea în acreditările noastre Amazon S3. Acest tutorial presupune că ați înregistrat deja un cont și că aveți aceste chei disponibile pentru dvs. Deoarece aceste valori nu ar trebui să se schimbe pe parcursul ciclului aplicației noastre, ar trebui să fie declarate în mod corespunzător ca fiind constante.

 // AWS info access dacă (! Defined ('awsAccessKey')) definește ('awsAccessKey', 'cheia dvs. de acces'); dacă (! defined ('awsSecretKey')) definește ('awsSecretKey', 'secret-key');

Pasul 4 - Instanțierea

Bine, am cerut fișierul de clasă necesar și ne-au declarat acreditările. Acum este momentul să creați o nouă instanță a clasei S3. Acest lucru ne va oferi apoi o mulțime de metode de ajutor atunci când accesăm S3.

 // instanțiați clasa $ S3 = noul S3 (awsAccessKey, awsSecretKey);

Această clasă va accepta inițial doi parametri: cheia de acces și respectiv cheia secretă. Mai sus, trecem prin constantele pe care le-am declarat la pasul trei.


Pasul 5 - includeți afișarea

Bine, asta va face pentru moment. Să mergem mai departe și să construim punctul nostru de vedere - sau forma. Mai degrabă decât combinând toate aceste PHP și HTML, vom crea un fișier șablon și îl vom include. La fundul index.php, adăuga:

 includ "index.tmpl.php";

Continuați și creați acest fișier nou și nu ezitați să îl stocați în rădăcina directorului dvs. de proiect. Să adăugăm marcajul inițial și formularul în sine.

      Încărcați în S3     

Incarca un fisier

Toate acestea ar trebui să vă pară mai degrabă cunoscute. Pentru a sublinia însă câteva particularități:

  • X-UA-Compatibil meta tag-ul asigură că Internet Explorer, indiferent de ce, folosește cel mai recent motor de randare, mai degrabă decât să se întoarcă în modul IE7.
  • Vom folosi JavaScript pentru a permite încărcarea mai multor fișiere, deci avem nevoie de un cârlig în marcajul nostru. Soluția cea mai comună este de a aplica o clasă de no-js la html element, apoi suprascrieți-l cu ajutorul JavaScript-ului js. Este o soluție ușoară!
  • Forma noastră simplă conține numai a fişier intrare. Rețineți că am setat enctype la multipart / form-data. Acest lucru este necesar pentru toate încărcările de fișiere. Butonul de trimitere va fi adăugat mai târziu în acest tutorial, când vom integra pluginul Uploadify.
  • Pentru moment, am setat acțiune a formularului la pagina curentă, dar am trecut și valoarea "încărcări" în setul de interogări.


Pasul 7 - După încărcare

Deci, ce se întâmplă când un utilizator selectează un fișier? Excluderea faptului că nu am integrat încă a depune butonul, datele fișierelor vor fi stocate în memoria temporară. Ne vom ocupa de procesul de salvare a fișierelor în dosarul nostru local într-un pas viitor. Pentru moment, să procedăm, presupunând că fișierele au fost salvate în dosarul "încărcări".

Să ascultăm pentru o încărcare cu PHP. Întoarce-te la tine index.php controlor. Imediat după ce ați creat o nouă instanță a clasei S3:

 // instanțiați clasa $ s3 = noul S3 (awsAccessKey, awsSecretKey); // verificați dacă a fost trimis un formular. dacă (isset ($ _GET ['uploads'])) 

Amintiți-vă cum am setat acțiune atributul formularului să treacă ?Încărcări = complet în interogarea de interogare? Această valoare va fi apoi disponibilă pentru noi prin: $ _GET [ ''] încărcările. Deci, atunci când pagina se încarcă, dacă această valoare există, atunci știm că formularul a fost trimis. Excelent!

În continuare, ar trebui să declarăm câteva variabile, care fac referire la modul și locul în care vrem să susținem fișierele trimise. Următorul cod va fi plasat în dacă declarația de mai sus.

 $ bucketName = 'meuUploader'; $ uploadsDir = 'încărcări /'; $ refused_types = array ("cerere / exe");

Când citiți "găleată", gândi "pliant."

S3 utilizează termenul găleată, dar se referă, în esență, la numele unui dosar din contul dvs. Simțiți-vă liber să numiți așa cum doriți. Mi-am sunat găleata, myUploadr.

Apoi, trebuie să știm unde au fost stocate fișierele încărcate. Apoi vom folosi acea cale pentru a încărca secvențial fișierele din acel dosar în galetul S3. Creați un dosar, numit încărcări, și plasați-o în rădăcina proiectului dvs..

În cele din urmă, ar trebui să desemnați fie tipurile de fișiere care pot fi încărcate, fie opusul. Această opțiune va depinde de nevoile specifice ale proiectului dvs. În acest caz, pentru a păstra lucrurile simple, vom nega toate executabil fișiere, dar nu ezitați să modificați cum doriți.

Rețineți că $ refused_types matricea nu face nimic în sine. Este pur și simplu o matrice pe care o vom face mai târziu.


Pasul 8 - Scanarea directorului de încărcări

Pentru a determina cu ce fișiere trebuie să lucrăm, trebuie să scanăm directorul de încărcări. PHP oferă ajutor scandir pentru a permite acest lucru.

 $ fișiere = scandir ($ uploadsDir); array_shift (fișiere $); array_shift (fișiere $);

Observați întotdeauna modul în care scandir funcția întoarce întotdeauna două elemente: "." și '? „? Acestea se referă la foldere și, deși am putea fi ceva mai tehnic despre asta, să fim leneși și să le alunecăm pe cei doi de pe lista noastră, folosind array_shift funcţie. Asta ne va lăsa cu:

 Array ([0] => unele-file.jpg)

Pasul 9 - Trimiteți la S3

Bine, acum că avem o serie de fișiere care trebuie încărcate, să profităm de clasa S3! Să înțelegem asta. Avem nevoie să:

  1. Creați o găleată S3
  2. Filtrați prin toate fișierele din directorul "încărcări"
  3. Schimbați numele fișierului la ceva unic. Poate putem folosi PHP-ul timp pentru aceasta. În caz contrar, riscăm suprascrierea fișierelor care au aceleași nume.
  4. Încărcați fișierul în S3
  5. Ștergeți fișierul din dosarul temporar "încărcări", deoarece acesta este acum stocat pe S3.
 // creați o nouă găleată $ S3-> putBucket ("$ bucketName", S3 :: ACL_PUBLIC_READ); // filtra prin elementele din folderul "încărcări /" pentru ($ i = 0; $ i < count($files); $i++ )  // Determine what type of file it is. (for example, "image/png") $mt = mime_content_type('uploads/' . $files[$i]); // If the file type is in our refused_types array, delete it, and continue? if ( in_array($mt, $refused_types) )  // can't accept this file type. Delete it. // You could also reverse this to only accepted allowed-types. unlink($uploadsDir . $fils[$i]); continue;  //Prefix a unique sequence of characters to the file name $fileName = time() . '-' . $files[$i]; // path to file we want to move, the desired bucket, the desired file name, when it is added to the bucket, Access control list if ($S3->putObjectFile ($ uploadsDir. $ fișiere [$ i], "$ bucketName", $ fileName, S3 :: ACL_PUBLIC_READ)) // șterge fișierul unlink ($ uploadsDir. $ files [$ i]); // actualizeaza fisiereArr $ filesArr [$ files [$ i]] = "http: //$bucketName.s3.amazonaws.com/$fileName"; 

Linie cu linie

Bine, să luăm linia de cod în linie, pentru o claritate maximă.

 $ S3-> putBucket ("$ bucketName", S3 :: ACL_PUBLIC_READ);

Această metodă a clasei $ S3 ne permite să adăugăm o nouă găleată în contul nostru S3. Acceptă doi parametri: numele găleții și permisiunile. Aici, am trecut în "myUploader" și am setat permisiunile pentru a citi publicul.

 pentru ($ i = 0; $ i < count($files); $i++ ) 

Acest pentru declarația ne va permite să navigăm prin toate imaginile din încărcări pliant.

 $ fileName = timp (). "-". $ Fișiere [$ i];

Această linie va asigura că numele fișierului este unic și nu se ciocnește cu fișierele existente în cupă pe S3. timp() funcția va prefixa un șir unic de caractere pentru numele fișierului nostru.

 dacă $ ($ s3-> putObjectFile ($ uploadsDir. $ fișiere [$ i], "$ bucketName", $ fileName, S3 :: ACL_PUBLIC_READ)) 

Această linie gestionează procesul de încărcare a fișierului în S3, grație ajutorului putObjectFile metodă a clasei S3. Această metodă va accepta patru parametri primari.

  • Calea spre fișierul pe care dorim să o încărcăm în S3
  • Numele bucketului (dosarul) pe care îl încărcăm
  • Numele fișierului dorit
  • Parolele de acces atribuite
 deconectați ($ uploadsDir. $ files [$ i]);

Dacă fișierul a fost încărcat cu succes, nu mai avem nevoie să îl stocăm local. Putem șterge fișierul folosind PHP deconectez funcția și trecerea într-o cale spre fișierul care ar trebui șters.

Acum, dacă încărcăm mai multe fișiere în S3, care este probabil? Avem nevoie de un loc pentru a stoca căile către toate aceste fișiere, nu? În acest sens, să creăm o nouă matrice, numită $ filesArr.

 // array care conține link-uri către toate imaginile încărcate $ filesArr = array ();

Puteți pune acest lucru în partea superioară a dvs. dacă afirmație. Cu matricea pe care am creat-o, trebuie doar să împingem calea către fiecare fișier încărcat.

 // actualizeaza fisiereArr $ filesArr [$ files [$ i]] = "http: //$bucketName.s3.amazonaws.com/$fileName";

Odata ce pentru declarația finalizează, $ fileArr va conține, în consecință, o listă de căi pentru fiecare fișier încărcat. Presto!

terminat index.php Fişier

Consultați mai jos codul sursă completat pentru "controlerul" nostru simplu.

 putBucket ("$ bucketName", S3 :: ACL_PUBLIC_READ); // filtra prin elemente în folderul uplaod pentru ($ i = 0; $ i < count($files); $i++ )  //retrieve post variables $fileName = time() . '-' . $files[$i]; // path to file we want to move, the desired bucket, the desired file name, when it is added to the bucket, Access control list if ($s3->putObjectFile ($ uploadsDir. $ fișiere [$ i], "$ bucketName", $ fileName, S3 :: ACL_PUBLIC_READ)) // șterge fișierul unlink ($ uploadsDir. $ files [$ i]); // actualizeaza fisiereArr $ filesArr [$ files [$ i]] = "http: //$bucketName.s3.amazonaws.com/$fileName";  include "index.tmpl.php";

Pasul 11 ​​- Încărcări de fișiere cu încărcare


Am scris toate funcționalitățile pentru server pentru aplicația noastră web mică. Dar acum, trebuie să rezolvăm procesul front-end de încărcare a mai multor fișiere către noi încărcări / director. Pentru a face acest lucru, vom profita de funcția Uploadify.

"Uploadify este un plugin jQuery care integrează un utilitar complet de încărcare a fișierelor personalizabile pe site-ul dvs. Utilizează un amestec de Javascript, ActionScript și orice limbă de pe server pentru a crea dinamic o instanță peste orice element DOM de pe o pagină.

Descarca

Primul pas, atunci când integrați Uploadify, este să descărcați fișierele necesare. Acestea pot fi obținute aici. Redenumiți dosarul descărcat pentru a "încărca" și plasați-l în rădăcina directorului de proiect.

Scriere Referințe

Apoi, trebuie să menționăm fișierele necesare din vizualizarea noastră. Intoarce-te index.tmpl.php, și, chiar înainte de închidere corp tag, adăugați:

    

Aici, facem referire la cea mai recentă versiune a jQuery, swfobject, script-ul de bază al lui Uploadify și propriul nostru scripts.js (puteți crea acel fișier acum).

Scripts.js

Hai să acționăm acum.

 ('uploader': 'uploadify / uploadify.swf', 'script': 'uploadify / uploadify.php', 'uploadify' 'cancel': 'uploadify / cancel.png', 'dosar': 'uploads', 'auto': true, 'multi': true, 'wmode': 'transparent', ' , 'sizeLimit': 10485760, // 10 megs 'onAllComplete': function () // toate fișierele au terminat de încărcat locația = "index.php? uploads = complete";);) ();

Activarea încărcării este la fel de simplă ca apelarea unei metode. Amintiți-vă, Uploadify este doar un plugin jQuery minunat. Această metodă acceptă o mulțime de parametri opționali. Vă încurajez să le priviți aici. Pentru nevoile noastre speciale, avem nevoie doar de o mână.

  • Uploader: Calea către swf fișierul care gestionează butonul de trimitere
  • script: Calea spre uploadify.php
  • cancelImg: Calea către butonul de anulare. (Unul este furnizat implicit)
  • pliant: Calea către dosarul în care vor fi stocate fișierele încărcate
  • auto: Un boolean, care indică dacă încărcările ar trebui efectuate automat.
  • multi: Sunt permise mai multe încărcări de fișiere?
  • wmode: Setați acest lucru la transparent pentru a vă asigura că nu există probleme de tip "z-index", unde butonul este afișat într-un meniu derulant sau ceva similar.
  • buttonTxt: Ce ar trebui să spună butonul de trimitere?
  • sizeLimit: Care este dimensiunea maximă a fișierului pe care o vom accepta?
  • onAllComplete: Această metodă se va difuza când toate fișierele vor fi încărcate. În cazul nostru, reîncărcați pagina și treceți Încărcări = complet param în șirul de interogare.

Ar trebui să o facă! Doar asigurați-vă că sunați pe noi uploadify funcția de la partea de jos a scripts.js.

 myUploadr.uploadify ();

Acest cod va aplica butonul personalizat în formularul dvs. și se va ocupa, de asemenea, de logica încărcării și transferării fișierelor în dosarul necesar.





Pasul 12 - Afișarea rezultatelor

În acest moment, am scris cea mai mare parte a logicii noastre. Dar este o ultimă sarcină pe care trebuie să o terminăm. Amintiți-vă când am scris logica care a preluat încărcările în contul nostru S3? Am stocat link-urile într-un mulțime, denumit $ filesArr.

Atunci când forma noastră se încarcă, ar trebui să determinăm dacă aceasta mulțime există și nu este gol. În acest caz, fișierele au fost deja încărcate, caz în care trebuie doar să afișăm linkuri către fiecare material încărcat.

Intoarce-te index.tmpl.php, și, sub forma primară, adăugați următoarele:

  

Legături către fișierele încărcate

    $ path):?>
  • „>

Acest bit de cod determină mai întâi dacă $ filesArr există. În caz contrar, acesta conține atât numele, cât și legătura cu fiecare fișier încărcat. Pentru a afișa acele linkuri, procesul este la fel de simplu ca și filtrarea prin fiecare element din matrice și prin ecuația unei etichete de ancoră care face legătura cu fișierul asociat.



Completare

Ar trebui să o facă! Acum, că toate funcționalitățile sunt în afara modului, următorul pas este să modelați pagina în funcție de nevoile dvs. specifice. Am putea acoperi acest lucru, dar este cu siguranță dincolo de scopul acestui tutorial. Utilizați-vă imaginația - iată ce am ajuns.


Vă mulțumim pentru lectură și spuneți-mi dacă aveți întrebări! Dacă unele părți ale tutorialului scrisului v-au confundat, asigurați-vă că ați urmărit și scenariul!

Cod