AJAX iskanje datotek, dodajanje v seznam ter predogled le teh (PDF, jpeg)
Na blogu sem že pisal o iskanju vsebine, kjer smo poiskali rezultate ter le-te dodali v seznam (z dodatnimi informacijami). Pri iskanju datotek je princip podoben. Z AJAX-om poiščemo datoteke, ki ustrezajo danim pogojem, rezultate dodamo v seznam s pomočjo Javascript-a ter jih, ko so izbrane s strani uporabnika tudi prikažemo (predogled). Predogled je možen za različne vrste datotek, v našem primeru bomo uporabili PDF, Jpeg datoteke (mimetype).
Kot generičen pristop za predogled različnih tipov datotek sem uporabil HTML object tag. Ker IE HTML Object tag, ki vsebuje sliko, prikaže kot iframe z drsniki sem za slike uporabil standarden HTML img tag. HTML Img tag bi bil dober tudi za PDF, če bi vsi podpirali predogled (inline document support) PDF-ja skozi img tag, kot recimo Safari brskalnik.
Začnimo z iskanjem. S pomočjo moje standardne AJAX knjižnice pokličemo PHP skripto, ki poišče datoteke na našem FTP-ju (datoteke so Y vsebine, služijo le kot primeri):
-
function preformAJAXSearch(input, extension, category) {
-
sendRequest('ajax_files_search.php', 'input='+input+'&extension='+extension, 'filesSearched', 'GET', 'An error occured while trying to preform search. Please inform admin staff.')
-
}
-
//RM13032008 Preform search and return back XML with elements
-
$results = populateArrayWithFolderContent('files', $input, $extension);
-
-
-
$width = ($info[0]> 556) ? 556 : $info[0];
-
$height = ($info[1]> 400) ? 400 : $info[1];
-
} else {
-
$width = 556;
-
$height = 400;
-
}
-
-
$text .= '
-
<suggestions>
-
<mimetype>'.$result['mimetype'].'</mimetype>
-
<width>'.$width.'</width>
-
<height>'.$height.'</height>
-
</suggestions>';
-
}
-
-
$text = '
-
<respond>
-
<search_input>'.$input.'</search_input>
-
'.$text.'
-
</respond>';
-
echo $text;
-
exit;
Vse datoteke, ki ustrezajo pogojem (ime datoteke, vrsta datoteke) dodamo v tabelo, nato se po tabeli sprehodimo in dodamo še attribute za velikost (velikost naj ne bi bila večja od 556*400, saj bi s tem pokvarila izgled iskalnika oz. predogleda). Ker object tag potrebuje mimetype informacijo, uporabimo vnaprej defenirane vrste datotek, le-to dodamo pod XML rezultat. Funkcijo, ki skrbi za iskanje po datotekah si lahko ogledate spodaj pod pripetimi datotekami.
Dobljene rezultate dodamo v seznam (HTML select), skupno z nekaj dodatnimi informacijami:
-
var width = request.responseXML.getElementsByTagName('width')[i].firstChild.data;
-
var height = request.responseXML.getElementsByTagName('height')[i].firstChild.data;
-
var mimetype = request.responseXML.getElementsByTagName('mimetype')[i].firstChild.data;
-
var filename = request.responseXML.getElementsByTagName('filename')[i].firstChild.data;
-
var filepath = request.responseXML.getElementsByTagName('filepath')[i].firstChild.data;
-
-
var option = document.createElement("option");
-
option.text = filename;
-
option.value = filepath;
-
option.width = width;
-
option.height = height;
-
option.title = mimetype;
... ter prvo datoteko označimo kot izbrano (atribut selected) in tudi aktiviramo predogled te datoteke:
-
if (i == 0){
-
setSelectedIndex(select, filepath);
-
previewPicture();
-
}
Pri seznamu datotek (HTML select) dodamo naj se ob spremembi izbrane opcije ali na klik katerekoli opcije (HTML option) pokliče previewPicture() funkcija:
-
onclick="previewPicture();" onchange="previewPicture();"
Poglejmo si še del previewPicture() funkcije, ki kreira object tag ali IMG tag, odvisno od vrste datoteke:
-
if (mimetype == 'image/jpeg') {
-
picturePreviewDiv.innerHTML = "<img style=\"border: 0px\" width=\""+width+"\" height=\""+height+"\" src=\""+filepath+"\" alt=\"Datoteke: "+filename+" ni bilo moč najti.\" />";
-
return;
-
}
-
-
picturePreviewDiv.innerHTML = "<object data=\""+filepath+"\" type=\""+mimetype+"\" width=\""+width+"\" height=\""+height+"\">Datoteke: "+filename+" ni bilo moč najti</object>";
Datoteke:
- Zgoraj omenjena koda na enem mestu - preizkusite delovanje
- Javascript koda, ki skrbi za funkcionalnost iskanja, dodajanje v seznam in predogleda izbrane datototeke
- PHP koda, ki išče datoteke na FTP-ju ter izpiše XML z rezultati
- PHP koda, ki išče datoteke na FTP-ju ter izpiše XML z rezultati - v .inc formatu
Dodatne informacije:
- What is the HTML object tag - zelo nazorni prikazi ter problemi z object tag-om
- Testiranje različnih vsebin v object tag-u - zelo kvalitetna vsebina
- Safari inline PDF ter nekaj primerov uporabe object tag-a
- Dodatek k prejšni strani - part 2
P.S: Pri iskanju zaradi preprosti upošteva iskalni niz le ko je izbrana tudi vrsta datoteke.
Delodajalec: KMAG d.d.
Podobni članki:
- AJAX iskanje in dodajanje v seznam (select) z dodatnimi informacijami
- Predogled PDF-ja – pretvorba PDF v jpeg s pomočjo PHP-ja
- AJAX na enostaven način
- Javascript – delci uporabne kode
- AJAX Gmail indikator – prikaz statusnega okna pri AJAX operacijah
- Javascript predogled slike – CSS opacity – picture preview – picture fade
- Google AJAX Suggest kopija
- PHP funkcije v Javascript jeziku – isset
- Shrani datoteko / Odpri datoteko dialog – download center (mime-type, Content-type, Content-Disposition)
- Safari podpira predogled PDF-ja skozi IMG tag (inline PDF document support)



March 16th, 2008 ob 7:14 pm
Neke silne uporabnosti lih ni, pa še precej počasi se odziva ajax... mogoče bi lahko izboljšu tko da če je vnosno polje prazno, da nebi klical ajax zahteve...
March 16th, 2008 ob 7:44 pm
Same datoteke se nalagajo malce počasneje ker so drugače zelo velike (wallpaper - 1280x1024 ali več). Pri odzivnosti veliko doda tudi, da gremo skozi celoten folder in pregledujemo datoteke ter dobimo še informacijo ven z getimagesize. Se pa strinjam, da bi se dalo marsikaj naredit.
Samo hitrost lahko prodaš tukaj, kjer je brez iskanja po FTP-ju in dobivanju informacij o dodatekah zadeva veliko hitrejša (čas meri od takrat ko začne iskat, ker čaka 600ms da uporabnik neha tipkat - pri vseh treh AJAX primerih je tako):
http://trsplet.com/blog/wp-content/uploads/2008/03/ajax_iskanje_dodajanje_v_seznam.html
Prazno polje se upošteva kot "dobi vse" in je bil zaželejen feature, je pa res da bi bilo boljše in manj potratno, kot recimo tukaj:
http://trsplet.com/blog/wp-content/uploads/2008/03/ajax_iskanje.html
Uporabnost je relativna stvar. Pri KMAG-u kjer smo to uporabili pride zelo prav. Med 10000 datotekami je zelo težko izbrati tisto, ki iščeš, z iskanjem in predoglem je to veliko hitreje kot karkoli drugega. Med 10 datotekami pa nima smisla tega dodajat kot si sam rekel.
March 16th, 2008 ob 8:44 pm
aja edin tole mi ni jasn... zakaj je una datoteka v .inc formatu??
March 16th, 2008 ob 8:55 pm
.inc, zato da server ne izvede php skripto, ampak prikaže kot text, tako da lahko vidite kodo. Če date v php-ju include ('xyz.inc'), pa tut dela.
March 16th, 2008 ob 9:11 pm
no sj to vem da dela .inc, samo ni mi blo čist jasn
no dobr, sm zakluču.
March 16th, 2008 ob 9:28 pm
ni problema, komentarji dobrodošli:)