Gå til innhold

JSP: Hente en fil fra html-skjema...


Anbefalte innlegg

Oppgave: Laste opp filer til mySQL-database vha. jsp og skjema (<form>)...

Nå har jeg slitt med dette alt for lenge, uten å komme videre...!

:hmm:

 

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
Videoannonse
Annonse

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 :p

Endret av blackbrrd
Lenke til kommentar
  • 3 uker senere...

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 av jogrba
Lenke til kommentar
  • 3 måneder senere...

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...