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