JavaApplet => CGI => Failas

Kaip aš dariau išsaugojimą į failą:

// Pavyzdys imtas iš Tvarkaraščio uždavinio. Pas jus gali skirtis duomenys, bei
// apdorojantis juos skriptas. Tarkime turiu String masyvų masyvą

public String [][] Mokytojai0 = new String[eMo][sMo];

// Dabar truputi apie apletus. Kai paleidinėjame apletą iš HTML, mes jame nurodome
// codebase, t.y. darbinę vietą, kurioje būna arba apleto archyvas ar duomenų failas.
// Taigi paleidus apletą, tą nurodytą kelią mes galime sužinoti šios funkcijos
// GlobalTools.getCodeBase() pagalba. Taigi su žemiau esančia eilute aš apsirašau
// kelią į write.cgi skriptą, kuris apdoros mano siunčiamus duomenis. Pastaba: perkėlus
// apletą į kitą serverį automatiškai keisis ir šis kelias, todėl jums visai nereikės
// perkompiliuoti programos. Bet būtina žinoti, kad toje vietoje kurią aprašo žymė
// codebase turi būti šis skriptas write.cgi. Apie jį šiek tiek vėliau. Beje apletas
// gali kreiptis tik į tą skriptą iš kurio serverio jis ir pats buvo užkrautas.

public String write_program_url=new String(GlobalTools.getCodeBase()+"write.cgi" );

// Čia mano išvedinėjimo programa. Trumpai apie jos veikimą. Ji į vieną eilutę surašo
// visus duomenis iš String masyvų masyvo į StringBuffer tipo kintamąjį su atitinkamais
// skyrikliais, kuriuos žino mano apdorojantis skriptas write.cgi.

private void Output() throws IOException
{

// Toks buferio ilgis nes POST metodas nepalaiko daugiau simbolių.
StringBuffer all = new StringBuffer(8096);

// Pagalbinis kintamasis
String temp;
int i, j;

        // Su šių ciklų pagalba visas eilutes iš String masyvų masyvo perrašau į vieną
        // StringBuffer tipo kintamąjį su skyrikliais “::”. Kai baigiamas pirmojo masyvo
        // pirmojo nario masyvas (viena matricos eilutė) rašomas skyriklis “&&”, galima
        // sakyti jis atitinka rezultatų faile naują eilutę.
        for (i=0; i<eMo; i++){
        for (j=0; j<sMo; j++){
        if (j != (sMo-1)) temp = "::"; else temp = "";
            all.append(URLEncoder.encode(Mokytojai0[i][j]+temp));
        }
        if (i != (eMo-1)) {temp = "&&"; all.append(URLEncoder.encode(temp));}
        }

        // Visą turinį iš StringBuffer kintamojo perrašau į kintamąjį, kurio duomenys jau
        // bus siunčiami skriptui, funkcijos toString() pagalba. Taigi turiu ištisą
        // duomenų seką su skyrikliais “::” ir “&&”. Pvz.:
        // Blonskis::15::48::65&&Bukšnaitis::89::74::12 ir t.t.
        String stringas = all.toString();

        // Toliau susikuriu URL tipo kintamąjį mūsų aukščiau susikurtam kintamąjam
        // write_program_url. Ir atidarau jungtį su tuo URL.
        try {
        URL url = new URL(write_program_url);
        URLConnection connection = url.openConnection();
        connection.setDoOutput(true);

        // Atidaromas rašymo srautas į tą URL. Ir įrašomas tenai suformuota duomenų sekas
        // su raktu string. Tai yra skriptui paduodama tokia informacija:
        // string=Blonskis::15::48::65&&Bukšnaitis::89::74::12. Uždaroma jungtis. Jūsų
        // problemos susijusios su duomenų perdavimu baigtos. Dabar darbą belieka atlikti
        // jūsų CGI skriptui write.cgi
        PrintWriter out = new PrintWriter(connection.getOutputStream());
        out.println("string=" + stringas);
        out.flush();
        out.close();
        }
        catch (MalformedURLException e){System.out.println(e);} catch (IOException e){System.out.println(e);};
        }

Mano write.cgi skriptas:

// Kelias iki Perl interpretatoriaus
#!/usr/local/bin/perl

// Naudojamos bibliotekos. Pirmoji – duomenų paėmimui iš CGI formų, antroji – failų // rakinimui.
use CGI;
use Fcntl ':flock';

// Rezultatų failo pavadinimas
$file="mokytojai.rez";

// Sukuriamas naujas objektas
$q=new CGI;

// Į masyvą @mas surašomi atsiųsti duomenys
// string=Blonskis::15::48::65&&Bukšnaitis::89::74::12 atskirti “&&” simboliais. Tai
// yra pirmasis masyvo narys bus $mas[0]=Blonskis::15::48::65, o antrasis
// $mas[1]= Bukšnaitis::89::74::12.
@mas = split('&&',$q->param('string'));

// Tikrinama ar yra nors vienas duomuo.
if ($mas[0] ne undef){

// Atidaromas failas rašymui ‘>’ ir iš karto rakinamas.
open (R,">$file");
flock(R,LOCK_EX);

// Parenkamas išvedimo srauto deskriptorius
select(R);

// Kiekvienas masyvo @mas narys vėl skaidomas į kitą masyvą, tik šį karta skyriklis
// “::” ir rašomas į failą apjungus su skyrikliu ‘ ‘, tai yra tarpu. Gale dedamas
// naujos eilutės simbolis.
foreach (@mas){
    @eil=split('::',$_);
    print join(' ',@eil);
    print "\n";
}

// Uždaromas failas, atrakinamas. Pakeičiami failo atributai, kadangi jis turės būti
// perskaitomas per naršyklę.
close(R);
flock(R,LOCK_UN);
system("chmod 655 $file");
}
exit(0);
 
 

By Termas Ó 2000
[email protected]

FUP dokumentacija
FUP dokumentacija

Kas tai yra FUP?

    Aš dabar ir pats galvoju ką tai galėtų reikšti. Pavadinimas paimtas iš (Arūno Venclovo, Kaunas, 1999 (c) [email protected], nuoroda http://www.soften.ktu.lt/~mockus/schoolcgi/doc). Manyčiau tai reiškia File Upload Package – bylų siuntimo paketas, kadangi tai geriausiai atspindi jo paskirtį. Problema iškilo tuomet, kai norima buvo Java apleto rezultatus išsaugoti serverio faile. Tuomet problemos sprendimui galiam pasitelkti į pagalbą CGI skriptą, kuris turi visas teises tame serveryje, kuriame jis yra. Tai yra Java apletas siunčia savo rezultatus tam CGI skriptui, o jis užsaugo juos į bylą serveryje. Tačiau Java apletas gali kreiptis rašymui tik į tą skriptą, kuris yra tame serveryje iš kurio užkrautas pats apletas. Visą šitą realizuoja FUP.

Į FUP direktoriją įeinančios bylos:

index.shtml
siusti.cgi
acceptsiusti.cgi
libas.pl
langas.js
show.cgi
klaida.cgi
admin.cgi
config.txt
left.gif
right.gif
Kiekvienos bylos paskirtis:
index.shtml – atlieka paskirtį kaip ir index.html ar home.html. Tai yra pagal nutylėjimą užkraunama byla patekus į FUP direktoriją iš naršyklės. Priedo šios bylos paskirtis yra užkrauti siusti.cgi skriptą.

siusti.cgi – iš konfigūracinio failo config.txt nuskaito ten esančias užduotis ir pateikia jas pasirinkimo sąraše, bei suformuoja duomenų failo perdavimo formą, t.y. failo pasirinkimas iš vartotojo kompiuterio. Užpildžius laukus ir paspaudus ant paveiksliuko valdymas perduodamas acceptsiusti.cgi programai, kartu perduodant įvestą duomenų failą, bei pasirinktą užduotį.

acceptsiusti.cgi – programa, skirta duomenų failo išsaugojimui į failą serveryje, bei pagal pasirinktą vartotojo užduotį sudėjimui nuorodų į duomenų failą, užduoties paleidimo apletą bei rezultatų failą.

libas.pl – biblioteka naudojama failo paėmimui per CGI sąsają. Ją naudoja programa acceptsiusti.cgi.

langas.js – tai Java Scripto funkcija skirta naujo lango atidarymui. Per parametrus ji gauna tinklapio URL, kurį reikia užkrauti tame naujame lange.

show.cgi – programa skirta duomenų bei rezultatų failų turiniams spausdinti. Per naršyklę jie gali būti ir neprieinami, bet kadangi šios programos savininkas sutampa su tų bylų savininku, tai ji gali jų turinius pateikti vartotojui.

klaida.cgi – pagalbinė biblioteka klaidos sąsajos formavimui. Jei pasirodo klaida (pvz. Siunčiama byla tuščia, ar jos nėra, ar dydis per didelis), tuomet į klaidos funkciją siunčiamas pranešimas apie klaidą, o pati funkcija sukuria jai gražią sąsają.

admin.cgi – programa skirta config.txt failo papildymui. Tai yra naujos užduoties, duomenų, apleto, rezultatų failų nustatymui. Pati programa ir apdoroja jai siunčiamus naujus įrašus.

config.txt – konfigūracinė byla, kurioje fiksuojami užduoties pavadinimas, užduoties duomenų failo kelias, užduoties paleidžiamojo apleto kelias, užduoties rezultatų bylos kelias. Šią byla naudoja acceptsiusti.cgi programa. Duomenys šioje byloje rašomi atskiroje eilutėje kiekvienai užduočiai atskirti simboliais “::”.

left.gif, right.gif – paveikslėliai į kairę ir į dešinę.

Instaliacija

     Raikalinga perkopijuoti visas bylas iš FUP direktorijos į jūsų pageidaujamą ir saugumo sumetimais nustatyti tokius atributus byloms:

index.shtml, langas.js, left.gif, right.gif byloms atributus rwxr-xr-x su komandų seka:

    chmod 755 index.shtml
    chmod 755 langas.js
    chmod 755 *.gif

siusti.cgi, acceptsiusti.cgi, libas.pl, show.cgi, klaida.cgi, admin.cgi, config.txt byloms atributis rwx------ su komandų seka:

    chmod 700 *.cgi
    chmod 755 libas.pl
    chmod 755 config.txt

Po to su admin.cgi programa (paleiskite per naršyklę) surašykite norimas pajungti užduotis su reikalingais atributais.