Încărcarea fișierului HTML5 utilizând glisarea și plasarea. HTML5: Încărcarea fișierelor cu drag-and-drop

Datorită inovațiilor HTML5, crearea interfețelor Drag and Drop a devenit mult mai ușoară. Din păcate, aceste inovații nu au încă suport extins pentru browser, dar sper că acest lucru se va schimba în curând (funcționează în prezent în Firefox 4+, Chrome și Opera 11.10).

Markup Trebuie să spun imediat că articolul a fost scris mai mult pentru începători decât pentru profesioniști. Prin urmare, unele puncte vor fi descrise în detaliu.

Mai întâi, trebuie să creăm un fișier HTML cu următorul conținut:

Pentru a descărca, trageți fișierul aici.

Toată munca noastră se va întâmpla cu containerul dropZone. Acum să adăugăm stiluri pentru documentul nostru (style.css):

Corp ( font: 12px Arial, sans-serif; ) #dropZone (culoare: #555; dimensiunea fontului: 18px; text-align: center; lățime: 400px; umplutură: 50px 0; margine: 50px automat; fundal: #eee ; bordura: 1px solid #ccc; -webkit-border-radius: 5px ) #dropZone.hover ( background: #ddd; border-color: #aaa; ) #dropZone.error ( background: #faa ; border-color: #f00; ) #dropZone.drop ( fundal: #afa; border-color: #0f0; )

În stiluri, puteți observa trei stări pentru elementul dropZone: la trecerea cu mouse-ul, dacă apare o eroare și când are succes.

Se încarcă scriptul Acum ajungem la partea distractivă - scrierea codului JavaScript. În primul rând, trebuie să creăm variabile, în una dintre acestea vom plasa dropZone, iar în a doua vom indica dimensiunea maximă a fișierului.

$(document).ready(function() ( var dropZone = $("#dropZone"), maxFileSize = 1000000; // dimensiunea maximă a fișierului - 1 MB. ));

În continuare trebuie să verificăm dacă browserul acceptă Drag and Drop, pentru aceasta vom folosi funcția FileReader. Dacă browserul nu acceptă Drag and Drop, atunci în interiorul elementului dropZone vom scrie „Nu este acceptat de browser!” și adăugați clasa „eroare”.

Dacă (typeof(window.FileReader) == „nedefinit”) ( dropZone.text(„Nu este acceptat de browser!”); dropZone.addClass(„eroare”); )

Următorul lucru pe care îl vom face este să animam efectul tragerii unui fișier pe dropZone. Vom urmări aceste acțiuni folosind evenimentele „ondragover” și „ondragleave”. Dar, deoarece aceste evenimente nu pot fi urmărite de obiectul jQuery, trebuie să accesăm nu doar „dropZone”, ci „dropZone”.

DropZone.ondragover = function() ( dropZone.addClass("hover"); return false; ); dropZone.ondragleave = function() ( dropZone.removeClass("hover"); return false; );

Acum trebuie să scriem un handler de evenimente pentru evenimentul „ondrop” - acesta este evenimentul când fișierul trasat este aruncat. În unele browsere, când trageți fișiere în fereastra browserului, acestea se deschid automat, astfel încât acest lucru să nu se întâmple, trebuie să anulăm comportamentul standard al browserului. De asemenea, trebuie să eliminăm clasa „hover” și să adăugăm clasa „drop”.

DropZone.ondrop = function(eveniment) ( event.preventDefault(); dropZone.removeClass("hover"); dropZone.addClass("drop"); );

Fișier var = event.dataTransfer.files; if (file.size > maxFileSize) ( dropZone.text(„Fișierul este prea mare!”); dropZone.addClass(„eroare”); return false; )

Acum trebuie să scriem o solicitare AJAX care trimite fișierul nostru către handler. Pentru a crea o solicitare AJAX vom folosi obiectul XMLHttpRequest. Să adăugăm doi handlere de evenimente pentru obiectul XMLHttpRequest: unul va afișa progresul de descărcare a fișierului, iar al doilea va afișa rezultatul descărcării. Vom specifica fișierul upload.php ca handler.

Var xhr = new XMLHttpRequest(); xhr.upload.addEventListener(„progres”, uploadProgress, false); xhr.onreadystatechange = StateChange; xhr.open("POST", "/upload.php"); xhr.setRequestHeader("X-FILE-NAME", file.name); xhr.send(fișier);

Acum să aruncăm o privire la progresul descărcării și la funcțiile de rezultat al descărcarii. Funcția „uploadProgress” nu este nimic complicat, ci doar matematică simplă.

Funcția uploadProgress(event) ( var procente = parseInt(event.loaded / event.total * 100); dropZone.text("Încărcare: " + procent + "%"); )

În funcția „stateChange”, trebuie să verificăm dacă procesul de încărcare este finalizat și, dacă da, trebuie să verificăm dacă a apărut vreo eroare. Codul de solicitare de succes este „200” dacă codul diferă de acesta, înseamnă că a apărut o eroare.

Funcția stateChange(eveniment) ( if (event.target.readyState == 4) ( if (event.target.status == 200) ( dropZone.text("Încărcare finalizată cu succes!"); ) else ( dropZone.text(" A apărut o eroare!"); dropZone.addClass ("eroare"); ) ) )

Partea JavaScript este finalizată.

Partea server Tot ce ne rămâne este să scriem un simplu handler care să salveze fișierul în locația de care avem nevoie. Nu voi intra prea mult în scrierea handler-ului, ci voi da doar un mic exemplu în PHP.

Atât, sper că articolul ți-a fost de folos.

Puteți descărca fișierele sursă

Permiteți utilizatorului să încarce fișiere pe server trăgându-le, de exemplu, de pe desktop. Mai mult, ar fi posibil să glisați și să plasați mai multe fișiere simultan.

Soluţie

După cum puteți vedea din exemplul de mai sus, fișierele sunt trimise la server imediat după selecție. Să le trimitem după eveniment:

Window.onload = function())( var uploader = new qq.FileUploader(( autoUpload: false, element: document.getElementById("file-uploader")), actiune: "php/upload.php" )); $(" # startUpload").on("clic", function())( uploader.uploadStoredFiles(); )); );

Rezultat

În general, pluginul are multe opțiuni și setări și există apeluri inverse. Toate acestea sunt descrise. Fineuploader este în dezvoltare constantă, așa că atunci când conectați, vă recomand să vizitați depozitul și să descărcați cea mai recentă versiune.

Stilizare

Plugin-ul își creează structura pe baza clasei .qq-uploader, toate elementele sunt descrise în fișierul css fileuploader.css

Nota

Dacă măgarii refuză cu încăpățânare să lucreze, deschideți scenariul și căutați rândul acolo:

Var form = qq.toElement("");

și schimbați în:

Var form = qq.toElement("");

  • HTML

Datorită inovațiilor HTML5, crearea interfețelor Drag and Drop a devenit mult mai ușoară. Din păcate, aceste inovații nu au încă suport extins pentru browser, dar sper că acest lucru se va schimba în curând (funcționează în prezent în Firefox 4+, Chrome și Opera 11.10).

Markup Trebuie să spun imediat că articolul a fost scris mai mult pentru începători decât pentru profesioniști. Prin urmare, unele puncte vor fi descrise în detaliu.

Mai întâi, trebuie să creăm un fișier HTML cu următorul conținut:

Pentru a descărca, trageți fișierul aici.

Toată munca noastră se va întâmpla cu containerul dropZone. Acum să adăugăm stiluri pentru documentul nostru (style.css):

Corp ( font: 12px Arial, sans-serif; ) #dropZone (culoare: #555; dimensiunea fontului: 18px; text-align: center; lățime: 400px; umplutură: 50px 0; margine: 50px automat; fundal: #eee ; bordura: 1px solid #ccc; -webkit-border-radius: 5px ) #dropZone.hover ( background: #ddd; border-color: #aaa; ) #dropZone.error ( background: #faa ; border-color: #f00; ) #dropZone.drop ( fundal: #afa; border-color: #0f0; )

În stiluri, puteți observa trei stări pentru elementul dropZone: la trecerea cu mouse-ul, dacă apare o eroare și când are succes.

Se încarcă scriptul Acum ajungem la partea distractivă - scrierea codului JavaScript. În primul rând, trebuie să creăm variabile, în una dintre acestea vom plasa dropZone, iar în a doua vom indica dimensiunea maximă a fișierului.

$(document).ready(function() ( var dropZone = $("#dropZone"), maxFileSize = 1000000; // dimensiunea maximă a fișierului - 1 MB. ));

În continuare trebuie să verificăm dacă browserul acceptă Drag and Drop, pentru aceasta vom folosi funcția FileReader. Dacă browserul nu acceptă Drag and Drop, atunci în interiorul elementului dropZone vom scrie „Nu este acceptat de browser!” și adăugați clasa „eroare”.

Dacă (typeof(window.FileReader) == „nedefinit”) ( dropZone.text(„Nu este acceptat de browser!”); dropZone.addClass(„eroare”); )

Următorul lucru pe care îl vom face este să animam efectul tragerii unui fișier pe dropZone. Vom urmări aceste acțiuni folosind evenimentele „ondragover” și „ondragleave”. Dar, deoarece aceste evenimente nu pot fi urmărite de obiectul jQuery, trebuie să accesăm nu doar „dropZone”, ci „dropZone”.

DropZone.ondragover = function() ( dropZone.addClass("hover"); return false; ); dropZone.ondragleave = function() ( dropZone.removeClass("hover"); return false; );

Acum trebuie să scriem un handler de evenimente pentru evenimentul „ondrop” - acesta este evenimentul când fișierul trasat este aruncat. În unele browsere, când trageți fișiere în fereastra browserului, acestea se deschid automat, astfel încât acest lucru să nu se întâmple, trebuie să anulăm comportamentul standard al browserului. De asemenea, trebuie să eliminăm clasa „hover” și să adăugăm clasa „drop”.

DropZone.ondrop = function(eveniment) ( event.preventDefault(); dropZone.removeClass("hover"); dropZone.addClass("drop"); );

Fișier var = event.dataTransfer.files; if (file.size > maxFileSize) ( dropZone.text(„Fișierul este prea mare!”); dropZone.addClass(„eroare”); return false; )

Acum trebuie să scriem o solicitare AJAX care trimite fișierul nostru către handler. Pentru a crea o solicitare AJAX vom folosi obiectul XMLHttpRequest. Să adăugăm doi handlere de evenimente pentru obiectul XMLHttpRequest: unul va afișa progresul de descărcare a fișierului, iar al doilea va afișa rezultatul descărcării. Vom specifica fișierul upload.php ca handler.

Var xhr = new XMLHttpRequest(); xhr.upload.addEventListener(„progres”, uploadProgress, false); xhr.onreadystatechange = StateChange; xhr.open("POST", "/upload.php"); xhr.setRequestHeader("X-FILE-NAME", file.name); xhr.send(fișier);

Acum să aruncăm o privire la progresul descărcării și la funcțiile de rezultat al descărcarii. Funcția „uploadProgress” nu este nimic complicat, ci doar matematică simplă.

Funcția uploadProgress(event) ( var procente = parseInt(event.loaded / event.total * 100); dropZone.text("Încărcare: " + procent + "%"); )

În funcția „stateChange”, trebuie să verificăm dacă procesul de încărcare este finalizat și, dacă da, trebuie să verificăm dacă a apărut vreo eroare. Codul de solicitare de succes este „200” dacă codul diferă de acesta, înseamnă că a apărut o eroare.

Funcția stateChange(eveniment) ( if (event.target.readyState == 4) ( if (event.target.status == 200) ( dropZone.text("Încărcare finalizată cu succes!"); ) else ( dropZone.text(" A apărut o eroare!"); dropZone.addClass ("eroare"); ) ) )

Partea JavaScript este finalizată.

Partea server Tot ce ne rămâne este să scriem un simplu handler care să salveze fișierul în locația de care avem nevoie. Nu voi intra prea mult în scrierea handler-ului, ci voi da doar un mic exemplu în PHP.

Atât, sper că articolul ți-a fost de folos.

Puteți descărca fișierele sursă

Poate că în unele cazuri dezvoltatorii de servicii sunt de vină, dar adesea problema constă în limitările impuse de browsere. Să luăm în considerare încărcarea fișierelor pe server.

În cele mai multe cazuri, vi se va prezenta un câmp standard cu un buton pentru a selecta un fișier de pe computer și/sau un câmp în care puteți specifica adresa URL a unui fișier aflat undeva pe Internet.

Nu vom atinge deocamdată descărcarea fișierelor de pe un computer local, intenționez să public o postare separată pe acest subiect, să ne uităm la descărcarea de pe un server la distanță.

Problemele încep chiar de la primul pas. Chiar dacă înțelegeți clar unde să căutați o adresă URL și sunteți bun la utilizarea instrumentelor precum firebug, va fi nevoie totuși de câteva clicuri pentru a obține adresa corectă. Ar fi mult mai convenabil să trageți pur și simplu imaginea dorită dintr-o fereastră de browser în alta.

Voi arăta implementarea unei astfel de interfețe în acest articol. Dacă doriți, puteți vedea cum funcționează pe pagina demo sau descărcați arhiva cu sursele.

Fiţi atenți! Acest exemplu funcționează numai în browserul Google Chrome. În teorie, suportul pentru toate tehnologiile necesare este disponibil în Firefox și Safari, dar încă nu le-am dat seama.

Ca obiecte de târât, am făcut în principal poze de pe Wikipedia. Au fost observate mai multe probleme legate de caracterele non-latine din URL-urile imaginilor, dar pentru a nu supraîncărca exemplul cu verificări și transformări, le-am lăsat așa cum sunt.


Principiul de funcționare

Standardul HTML5 oferă suport pentru tragerea și plasarea obiectelor din pagină. Apropo, am arătat deja un exemplu de cea mai simplă implementare a D&D - Drag & Drop folosind HTML5.

Și în plus, există destul de multe biblioteci JavaScript care implementează suport D&D.

Dar aici este important să înțelegeți că, dacă trebuie să „trageți” imagini din resurse terțe, atunci nu veți putea folosi biblioteci. Deoarece nu veți putea adăuga codul dvs. JS pe pagina altcuiva. Și pentru a descărca o imagine, trebuie să obținem adresa URL a acesteia, adică. Browserul trebuie să-și transmită și parametrii împreună cu obiectul tras (de exemplu, atributul src al unei imagini sau întreaga etichetă img).

În acest caz, putem crea un „receptor” de imagini pe pagina noastră. Acesta va fi un div obișnuit cu un handler de evenimente drop atribuit. Dacă utilizatorul „aruncă” imaginea deasupra acestui div, handlerul va fi apelat și în primul parametru va primi un obiect care conține informații despre imaginea care este trasă.

Implementarea





Să începem cu pagina noastră de aplicație.








Încărcare imagini

Conține două blocuri: imagini - aici vom afișa imaginile descărcate și img_target - trebuie să trageți imaginile în acest bloc.

În partea de jos a paginii conectăm biblioteca jQuery și scriptul main.js, care va trimite informații despre imaginile trase către server.

Să ne uităm la main.js
$(funcție() (
$("#img_target")
.bind("dragente", function(eveniment) (
$(this).addClass("drop_here");
})
returnează fals;
$(this).addClass("drop_here");
})
.bind("dragleave", function(eveniment) (
$(this).addClass("drop_here");
})
.bind("dragover", function(eveniment) (
.bind("drop", function(eveniment) (
$(this).removeClass("drop_here");
var srcRegex = /src=\"([^\s]+)\"/ig;
var data = event.originalEvent.dataTransfer.getData("text/html");
var img_data = srcRegex.exec(data);
$.post("upload.php", ("file_url":img_data), function(res) (
răspuns var = eval ("(" + res + ")"); "));
});
$("#imagini").append($("
});

returnează adevărat;

Cea mai mare parte a lucrărilor este realizată în gestionarea evenimentelor de eliminare. Când are loc acest eveniment, citim informații despre obiectul „reset” și „tăiem” valoarea atributului src, adică. URL-ul imaginii (liniile 16-18). Informațiile sunt transferate în obiectul event.originalEvent.dataTransfer (linia 17).

Apoi formăm o solicitare AJAX obișnuită și transmitem URL-ul găsit ca parametru.

Scriptul de server (upload.php) va primi adresa URL a imaginii pe serverul de la distanță și o va încărca. Și ca răspuns la solicitarea AJAX, va trimite noua adresă URL a imaginii încărcate.

La rândul său, handlerul de solicitări AJAX va crea o etichetă img și o va insera în blocul de imagini. Astfel, imaginile descărcate vor apărea deasupra câmpului de descărcare.

Luați în considerare upload.php

define("BASE_URL", "http://localhost/tests/images-upload/");

funcția upload_from_url($file_url) (
$url_segments = explode("/", $file_url);
$file_name = urldecode(end($url_segments));
dacă (fals!== $nume_fișier) (
$file_name_parts = explode(".", $file_name);
dacă (în_array(strtolower(end($file_name_parts))), array("jpeg","jpg","png","gif"))) (
$destination=fopen("incarcare/".$nume_fisier,"w");
$sursa=fopen($file_url,"r");
$maxsize=300*1024;
$lungime=0;
while (($a=fread($sursa,1024))&&($lungime „Adresa URL a fișierului nu este specificată”);

if (isset($_POST["file_url"])) (
$new_url = upload_from_url($_POST["file_url"]);
$res = array("file_url" => $new_url);
}

echo json_encode($res);

Principiul de funcționare este următorul. Citim URL-ul imaginii și încercăm să o descărcam (liniile 29-32).

Dacă imaginea este încărcată, salvați-o în folderul de încărcare. Recepția unei imagini de la un server la distanță se realizează folosind funcțiile fread. Fișierul este citit în blocuri de 1 kB (liniile 15-18). Această abordare vă permite să întrerupeți descărcarea unui fișier dacă dimensiunea acestuia depășește o limită specificată (în acest caz, 300 kB).

După descărcarea fișierului, generăm o adresă URL pentru acesta și o trimitem în browser în format JSON.

După cum puteți vedea, implementarea unui astfel de bootloader nu este dificilă. Și este destul de convenabil de utilizat. Desigur, principalul dezavantaj este suportul browserului pentru HTML5, sau mai degrabă lipsa acestuia

Cu toate acestea, dacă creați o interfață pentru angajații unei companii și puteți specifica tipul de browser, atunci poate fi folosit HTML5.

Și în această lecție vă voi arăta un exemplu de integrare a minunatului plugin Dropzone.js cu site-ul dvs. PHP pentru a încărca fișiere pe server în doar câteva rânduri de cod.

Dropzone.JS este o minunată bibliotecă open source scrisă în vanilla JS, care vă oferă o interfață drag and drop pentru încărcarea fișierelor cu previzualizări ale fișierelor.

Mai întâi, descărcați cea mai recentă versiune a bibliotecii și stilurile acesteia:

Apoi creați un folder de încărcări și fișiere index.php și upload.php

Fișierul index php poate fi acea parte a codului dvs. care conține formularul pentru adăugarea de materiale pe site. În exemplul meu, voi crea o pagină goală cu un marcaj minim și biblioteca și stilurile Dropzone.js incluse:

După cum probabil ați observat, am creat un formular cu acțiunea upload.php, dar nu am creat nicio intrare pentru atașarea fișierelor și nu am declarat enctype-ul formularului. Nu există nicio eroare în asta, totul este gestionat de biblioteca DropzoneJS în sine. Tot ce trebuie să facem este să dăm formularului o clasă dropzone. Implicit, DropzoneJS găsește toate formularele cu această clasă și își desenează automat interfața.

Puteți deschide pagina index.php pentru execuție în browser și vă asigurați că biblioteca funcționează conform intenției. Iată ce am primit:

Acum să creăm un handler de încărcare pentru care am creat deja un fișier upload.php. Iată un exemplu de cel mai simplu cod de încărcare al meu:

Lucrul cu fișierele descărcate

Pentru a interacționa pe deplin cu fișierele dvs., trebuie doar să adăugăm capacitatea de a le manipula. Mai întâi, trebuie să adăugăm o bucată de cod pentru a extrage informații despre fișierele stocate (nume și dimensiune) și să o returnăm în format JSON.

Pentru a face acest lucru, actualizați fișierul upload.php la acest formular (este inserată altă condiție):

  • Funcția PHP scandir scanează folderul de încărcări și returnează o serie de fișiere sau FALSE dacă folderul este gol.
  • Facem o buclă prin valoarea returnată de la funcția scandir și o salvăm în matricea $result. Amintiți-vă, ignorăm „." Și ".." deoarece scandir va returna întotdeauna "." Și „..” ca conținut valid legat de directorul curent și anterior.
  • Emitem anteturile corecte pentru marcajul JSON și, de asemenea, convertim matricea PHP într-un șir JSON folosind funcția json_encode.
  • Acum este timpul să actualizați index.php:

    Dropzone.options.myDropzone = ( init: function() ( thisDropzone = this; $.get("upload.php", function(data)) ( $.each(data, function(key, value)( var mockFile = (nume) : value.name, size: value.size ); thisDropzone.options.addedfile.call (thisDropzone, mockFile); ;

    Ce am făcut aici? Să ne dăm seama:

  • Din păcate, am adăugat biblioteca Jquery pe pagina noastră. Aceasta nu este cu adevărat o necesitate pentru DropzoneJs. Folosim doar funcția JQuery $.get ajax. La discreția dvs., puteți implementa solicitări similare în vue.js sau orice doriți.
  • Am adăugat un element ID (my-dropzone) în formular. Acest lucru este necesar pentru a transfera valorile de configurare în Dropzone. Și pentru aceasta trebuie să avem un identificator unic care să indice el. În acest fel putem configura biblioteca atribuind valori la Dropzone.options.myDropzone.
  • Să inițializam partea principală a editării. Ceea ce am făcut aici este transmisă o funcție pentru a asculta evenimentul init la Dropzone. Acest eveniment este declanșat când Dropzone este inițializat.
  • Primim o serie de fișiere de la „upload.php” folosind ajax.
  • Creați un mockFile folosind valorile de pe server. MockFiles sunt pur și simplu obiecte JavaScript cu proprietăți de nume și dimensiune. Apoi apelăm în mod explicit funcțiile Dropbox și adăugăm pictograme pentru a aduce fișierele existente în zona de încărcare Dropzone și pentru a crea miniaturi ale acestora.
  • Dacă ai făcut totul corect. Încărcați câteva imagini și reîncărcați pagina formularului. Fișierele încărcate anterior ar trebui să apară automat în zona Dropzone.