/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
servlet(igen)
Fra : dejan


Dato : 27-10-01 15:24

Jeg holder ikke op før jeg har tjek på disse sk.. servlets

Jeg har stillet dette spørgsmål før men kom ikke til en fornuftig løsning.
Jeg skal nemlig uploade nogle filer til en Oracle database ved brug af
servlets (dvs. ikke JSP). Jeg har lavet en java-applikation (komandoprompt
baseret) som gør det samme, nemlig: henter en fil fra min HD og sender den
til DB. Derefter henter jeg den samme fil fra DB og kopierer den til min HD.
Og det fungerer fint. Her er et stykke kode som jeg brugte (disse koder
kommer ikke i samme rækkefølge men kaldes via nogle metoder):

Statement stmt = connection.createStatement();
stmt.execute("CREATE TABLE mytabel (id int primary key, billede blob)");
stmt.execute("INSERT into mytabel values (1, EMPTY_BLOB())");
ResultSet rset = stmt.executeQuery("SELECT * FROM mytabel FOR UPDATE");
File file = new File("c:\\billede.jpg");
FileInputStream instream = new FileInputStream(file);
BLOB blob = ((OracleResultSet)rset).getBLOB("billede");
OutputStream outstream = blob.getBinaryOutputStream();
int x = blob.getChunkSize();
byte[] buffer = new byte[x];
int laengde = -1;
while ((laengde = instream.read(buffer)) != -1)
outstream.write(buffer, 0, length)
......osv...
(retningslinier til ovenstående kan bl.a ses i Oracle9i JDBC Developer's
Guide and Reference, kap. 7)

Og det fungerer fint. Men nu kommer vi til servlets. Jeg kan da bruge FORM:
<FORM ENCTYPE="multipart/form-data"
method="POST" action="/myservlet">
<INPUT TYPE="file" NAME="file">
<INPUT TYPE="submit" VALUE="upload">
</FORM>

Og hvad så? Metoden "getParameter(file)" returnerer en String, men i
tilfælde af multipart/form-data (file) får jeg ikke en String som henviser
til filens placering (så det kan bruges i ..."new File("c:\\billede.jpg");)
Hvis jeg prøver at "læse" indholdet af getParameter(file) så får jeg "null",
idet det er tale om en eller anden format i RFC 1867...
Jeg ved at der findes nogle klasser skrivet af Jason Hunter
(MultipartRequest) men på hjemmesiden står der ikke så meget om deres
implementation( http://www.servlets.com/), man skal vist have bogen for at
kunne gennemskue hvad man skal gøre. Jeg ønsker heller ikke at gemme filen
på min hd men kun at sende den fra brugernes filsystem til databasen.
MultipartRequest klassens ( fra "Java servlet programming (1. edition) )
constructor skal bl.a have variablen "String saveDirectory" og det kan jeg
ikke bruge til så meget. Og i øvrigt virker det lidt træls at jeg skal hente
hele Hunters com.oreilly.servlet package for at udføre denne operation. Der
må findes en simpel løsning hvordan man handler med multipart/form-data til
ovenstående formål. Jeg kan selvfølgelig skrive mine egne klasser som skulle
klare opgaven, men det ville være rart hvis der var nogen der allerede har
gjort noget der ligner (bortset fra Hunter og hvis vi ser bort fra at jeg er
under tidspres). Jeg har også overvejet at bruge applet til ovenstående
formål, og så kalde en applet fra servleten, hvor appleten så skal hente og
sende filen til DBen. Virker det fornuftigt?

mvh Dejan




 
 
Christian Holm (27-10-2001)
Kommentar
Fra : Christian Holm


Dato : 27-10-01 16:39

"dejan" <stranger@tdcspace.dk> wrote in message
news:3bdac324$0$25402$edfadb0f@dspool01.news.tele.dk...
> Og hvad så? Metoden "getParameter(file)" returnerer en String, men i
> tilfælde af multipart/form-data (file) får jeg ikke en String som henviser
> til filens placering (så det kan bruges i ..."new
File("c:\\billede.jpg");)
> Hvis jeg prøver at "læse" indholdet af getParameter(file) så får jeg
"null",
> idet det er tale om en eller anden format i RFC 1867...
> Jeg ved at der findes nogle klasser skrivet af Jason Hunter
> (MultipartRequest) men på hjemmesiden står der ikke så meget om deres
> implementation( http://www.servlets.com/), man skal vist have bogen for at
> kunne gennemskue hvad man skal gøre.

Prøv følgende:

MultipartParser aParser = new MultipartParser(fac.getRequest(),
Integer.MAX_VALUE);
Part p = aParser.readNextPart();
if (p.isFile())
{
InputStream is = ((FilePart) p).getInputStream();

.....//din egen kode
}

Christian Holm



dejan (27-10-2001)
Kommentar
Fra : dejan


Dato : 27-10-01 19:27


"Christian Holm" <cho@cubitech.dk> wrote in message
news:3bdad4fd$0$255$edfadb0f@dspool01.news.tele.dk...
> "dejan" <stranger@tdcspace.dk> wrote in message

> Prøv følgende:
>
> MultipartParser aParser = new MultipartParser(fac.getRequest(),
> Integer.MAX_VALUE);
> Part p = aParser.readNextPart();
> if (p.isFile())
> {
> InputStream is = ((FilePart) p).getInputStream();
>
> .....//din egen kode
> }

Hej Christian,
hvad er "fac.getRequest" (fac er vist et HttpServletRequest objekt men hvor
hører metoden getRequest til?)?

mvh Dejan

> Christian Holm
>
>



Christian Holm (27-10-2001)
Kommentar
Fra : Christian Holm


Dato : 27-10-01 19:54

"dejan" <stranger@tdcspace.dk> wrote in message
news:3bdafc43$0$25398$edfadb0f@dspool01.news.tele.dk...
>
> "Christian Holm" <cho@cubitech.dk> wrote in message
> news:3bdad4fd$0$255$edfadb0f@dspool01.news.tele.dk...
> > "dejan" <stranger@tdcspace.dk> wrote in message
>
> > Prøv følgende:
> >
> > MultipartParser aParser = new MultipartParser(fac.getRequest(),
> > Integer.MAX_VALUE);
> > Part p = aParser.readNextPart();
> > if (p.isFile())
> > {
> > InputStream is = ((FilePart) p).getInputStream();
> >
> > .....//din egen kode
> > }
>
> Hej Christian,
> hvad er "fac.getRequest" (fac er vist et HttpServletRequest objekt men
hvor
> hører metoden getRequest til?)?

Undskyld, min fejl. fac er en instans af et object jeg bruger som mellemvej
til en masse ting. fac.getRequest() skal bare erstattes af dit
HttpServletRequest object.

Christian



dejan (28-10-2001)
Kommentar
Fra : dejan


Dato : 28-10-01 04:00


"Christian Holm" <cho@cubitech.dk> wrote in message
news:3bdb02cb$0$269$edfadb0f@dspool01.news.tele.dk...

> Undskyld, min fejl. fac er en instans af et object jeg bruger som
mellemvej
> til en masse ting. fac.getRequest() skal bare erstattes af dit
> HttpServletRequest object.

Tak. Jeg har nu prøvet at bruge orellys klasser med det du beskrev (dog lidt
"omformuleret" ved:
FileInputStream instream =(FileInputStream)((FilePart) p).getInputStream();

istedet for InputStream.

Men nu sker der næsten intet: når jeg vælger filen i FORMen og trykker på OK
så kører browseren uafbrudt (Netscape skriver "connecting to 80.62.85..."
(mit IP)) og det er det. Jeg synes at jeg har læst på et eller andet sted at
sådan noget kan ske, men jeg kan ikke huske hvorfor. Er det noget du har
erfaringer med? (det er ligesom programmet kører en uendelig løkke).

Og i øvrigt, hvad skal jeg bruge når jeg endelig får denne (upload) servlet
til at køre, at får vist databasens indhold i browseren (dvs. disse jpg
filer som ligger i DBen som BLOBs samt nogle andre oplysninger).
Jeg har tænk noget i retningen med:

if (resultset.next()) {
BufferedInputStream myfile = new
BufferedInputStream(resultset.getBinaryStream("myblob"));
byte[] buffer = new byte[4*1024];
int laengde;
while((laengde= myfile.read(buffer, 0, buffer.length)) !=-1) {
out.write(buffer,0,laengde);
}

men jeg tvivler meget på at dette virker.


mvh Dejan

> Christian
>
>



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste