23. juni 2005 - 13:50Der er
8 kommentarer og 1 løsning
upload af billeder til database
Hejsa..
Jeg sidder og forsøger mig med at uploade et jpeg billede til et blob felt i en oracle db, vha. java servlets. filen bliver fundet ved hjælp af <input type=file> og formen er en multipart /form data. Jeg henter parameterne ud vha. en MultipartParser fra oreilly. Spørgsmålet går på om det er muligt at streame filen direkte til db-blob-feltet, eller man absolut skal lave en temp-fil på en server først?! lidt kode: //-------- MultipartParser mp = new MultipartParser(req, 1024*1024); // 1MB Part part; while ((part = mp.readNextPart()) != null) { String name = part.getName(); if (part.isParam()) { // det er en alm parameter.. ParamPart paramPart = (ParamPart) part; if(name.equals("filetype")) type = paramPart.getStringValue(); else if(name.equals("dbid")) dbid = paramPart.getStringValue(); } else if (part.isFile()) { // Det er billedet.... FilePart filePart = (FilePart) part; String fileName = filePart.getFileName(); if (fileName != null) { File image = new File(fileName); FileOutputStream fos = new FileOutputStream(image);
}catch(Exception b) { System.err.println("Error in uploadFileToTitanDb. b= "+b); } } } }//end while..
Kode fra Controlleren (DB'en) PrepareStatement ps; ps = getConnection().prepareStatement( "INSERT INTO PICTURES (URL, FILE_TYPE, DOKUMENT_TYPE, BLOB_DATA) VALUES( ?, ?, ?,? )" );
FileInputStream fis = new FileInputStream( pic );
ps.setString( 1, url ); ps.setString( 2, fileType ); ps.setString(3, docType); // Insert the image into the 4 Blob ps.setBinaryStream( 4, fis, ( int )pic.length());
// Execute the INSERT int count = ps.executeUpdate(); //--------------------</code>---------------- Jeg får en fejl der hedder at: "java.io.FileNotFoundException: worldmap.jpg (Access is denied)" inden jeg overhoved forsøger at sætte ind i db'en.
nogen ideer??! eller kan det slet ikk lade sig gøre at streame direkte til et blobfelt uden en temp?
MultipartParser mp = new MultipartParser(request, 1000000000); Part p = mp.readNextPart(); FilePart fp = (FilePart)p; InputStream is = fp.getInputStream();
korrekt at det er muligt at få en inputstream fra multiparseren, men for at sætte min setBinaryStream skal jeg også bruge længden på "filen".. og det er lidt tricky at finde frem til den?!?
Doh.. ja.. sikken en hjælp jeg ellers ville være til?!..:-) here goes: gør brug af en oracle.sql.BLOB klasse, (der dog ikke virker fuldt ud implementeret!?) til at loade bits'ene over i, og derefter bruger getBytes() fra blob-interfacet til at konvertere til et byte array. ved så at bruge en ByteArrayInputStream til at streame indholdet af arrayet til et preparedStatement, samt man har længden af arrayet(.length) kan de sidste parameter i ps.setBinaryStream(index, Stream, Size)
//---kode----- byte[] image; InputStream is = filePart.getInputStream(); BLOB bl = BLOB.createTemporary(controller.getConnection(),true, BLOB.DURATION_CALL); OutputStream os = bl.getBinaryOutputStream(); //os peger på bl nu! byte[] chunk = new byte[1024]; int i=-1; i = is.read(chunk,0,1023); while(i!=-1) { os.write(chunk,0,i); //Write the chunk into the blob i = is.read(chunk,0,1023); //read a new piece of blob } // When done close the streams os.close(); int size = (int) bl.length(); image = bl.getBytes(1,size); ByteArrayInputStream bais = new ByteArrayInputStream(image); storedFileId = controller.uploadPic(fileType,docType,fileName,bais,size); //********** Og her koden fra min Controller //-------kode---------------
storedFileId = controller.uploadPic(fileType,docType,fileName,BAIS,size); -----bais = is------ i (controlleren) ps.setBinaryStream( 5, IS, size);
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.