FunkyMonk Skrevet 16. februar 2006 Del Skrevet 16. februar 2006 Oppgave: Laste opp filer til mySQL-database vha. jsp og skjema (<form>)... Nå har jeg slitt med dette alt for lenge, uten å komme videre...! Altså, jeg har et slikt skjema: <form action="upload.jsp" method="POST" enctype="multipart/form-data"> <!-- enctype="multipart/form-data" --> <input type="file" name="fil"><br> <input type="submit"> </form> ...og jeg ønsker å ta imot denne fila i upload.jsp, men dette er ikke så lett! Jeg vet at jeg må skille ut fila fra annet snusk, før jeg gjør noe med den - men hvordan!? Jeg har prøvd med følgende snikete kode: <%@ page import="java.io.*" %> <% java.sql.Connection db = java.sql.DriverManager.getConnection ( "jdbc:mysql-server", "user", "pass"); java.sql.Statement st = db.createStatement(); java.sql.ResultSet rs; String contentType = request.getContentType(); if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0)) { DataInputStream in = new DataInputStream(request.getInputStream()); int formDataLength = request.getContentLength(); byte dataBytes[] = new byte[formDataLength]; int byteRead = 0; int totalBytesRead = 0; while (totalBytesRead < formDataLength) { byteRead = in.read(dataBytes, totalBytesRead, formDataLength); totalBytesRead += byteRead; } String file = new String(dataBytes); String saveFile = file.substring(file.indexOf("filename=\"") + 10); saveFile = saveFile.substring(0, saveFile.indexOf("\n")); saveFile = saveFile.substring(saveFile.lastIndexOf("\\") + 1,saveFile.indexOf("\"")); int lastIndex = contentType.lastIndexOf("="); String boundary = contentType.substring(lastIndex + 1,contentType.length()); int pos; pos = file.indexOf("filename=\""); pos = file.indexOf("\n", pos) + 1; pos = file.indexOf("\n", pos) + 1; pos = file.indexOf("\n", pos) + 1; int boundaryLocation = file.indexOf(boundary, pos) - 4; int startPos = ((file.substring(0, pos)).getBytes()).length; int endPos = ((file.substring(0, boundaryLocation)).getBytes()).length; FileOutputStream fileOut = new FileOutputStream(saveFile); out.println(saveFile); fileOut.write(dataBytes); fileOut.write(dataBytes, startPos, (endPos - startPos)); fileOut.flush(); } %> ...men her ender jeg opp med en FileOutputStream, mens det jeg skal ha er en BLOB i mySQL, altså må vel jeg få konvertert [k]fileOut[/k] til en File eller InputStream (?)... Noen som vet hvordan jeg gjør dette? Evt. noen som kan komme med andre løsninger for å fikse dette? PS: Jeg er ikke administratorrettigheter på JSP-serveren dette skal ligge på, slik at jeg er uten muligheter til å legge til packages (som jeg har på følelsen av at ville ha gjort dette mye enklere!)... På forhånd takk... Lenke til kommentar
blackbrrd Skrevet 16. februar 2006 Del Skrevet 16. februar 2006 (endret) Googlet litt og fant denne sida: http://forum.java.sun.com/thread.jspa?thre...ssageID=3079402 eksempelet er litt nede på sida, søk etter "Here is upload.jsp" (uten ") Det finnes garantert noen som har laget et bibliotek for å gjøre dette enklere, men jeg fant det ikke akkurat nå. Det er et problem med multipart form, og det er at du ikke kan kjøre request.getParameter("tekstfeltnavn") lenger når du har begynnt å lese multipart formet... Det må gjøres mer manuellt. Hmm.. tror egentlig jeg bare burde gitt ut den klassen en kompis av meg skrev for å håndtere multipart forms... den er ikke spes elegant, men den fungerer, og du kan hente ut fil-felter som byte[] dvs, du skriver noe sånt som: MyRequest myRequest = new MyRequest(request); // for å hente ut en fil så skriver du: byte[] file = myRequest.getFile("filenamefieldname"); String filename = myRequest.getFileName("filenamefieldname"); Hintet er ihvertfall å enkapsulere det i en klasse, sånn at det blir enkelt å bruke.. EDIT LES FRA HER: Fant det, å legge inn open source i google søket hjalp en smule http://jakarta.apache.org/commons/fileupload/ javadoc: http://www.jdocs.org/fileupload/1.0/api/index.html Koden blir da noe sånt som: import org.apache.commons.fileupload.*; FileUpload fl = new FileUpload(); FileItemFactory filefactory = fl.getFileItemFactory(); FileItem item = createItem(String fieldName, String contentType, boolean isFormField, String fileName) byte[] bytesforuseindbimport = item.get(); ... Hvorfor finne opp hjulet på nytt sier jeg Endret 16. februar 2006 av blackbrrd Lenke til kommentar
jogrba Skrevet 4. mars 2006 Del Skrevet 4. mars 2006 (endret) Bruk av Jakarta Commons Fileupload gjør alt MYE enklere. Men det er som du sier, man trenger administratorrettigheter, men er jo ikke verre enn om å be serverens administrator legge det inn... Endret 15. mars 2006 av jogrba Lenke til kommentar
morten_l Skrevet 14. juni 2006 Del Skrevet 14. juni 2006 Brukte Commons Fileupload til stor suksess for et år siden, mener jeg å huske. Mener jeg slet med Opera og IE og forskjellen på hvordan de håndterte filstier fra <form> taggen. I det ene tilfellet kom hele filstien med, i det andre tilfellet kun fil-navnet. Dette kan være noe å ha i bakhodet! Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå