JSP/Servlet: ServletInputStream kaputt
-
Das hier läuft nicht. Ich versteh aber nicht warum. Ich erhalte immer, daß data = -1 ist. Dieses Servlet wird aufgerufen, nachdem ich eine Datei zum Upload angegeben habe.
<form action="picturehandler" method="post"> <input type="file" /> <input type="submit" value="Datei hochladen"/> </form>
package requestHandler; import javax.servlet.http.*; import javax.servlet.*; import java.io.*; public class PictureHandler extends HttpServlet { static final long serialVersionUID = 6; public void service( HttpServletRequest request , HttpServletResponse response ) { try { ServletInputStream stream = request.getInputStream(); FileOutputStream outfile = new FileOutputStream("/Users/toom/Desktop/upload.file"); int data = 0; while( true ) { data = stream.read(); if( data == -1 ) break; //byte eightbits = (byte) data; outfile.write( data ); } outfile.close(); stream.close(); } catch ( Exception e ) { System.out.println("Exception in PictureHandler.public void service( HttpServletRequest request , HttpServletResponse response )"); e.printStackTrace(); } try { request.getRequestDispatcher("upload_pictures.jsp").forward( request , response ); return; } catch (Exception e) { e.printStackTrace(); } } }
Was mach ich denn falsch ???
-
Für den Dateiversand noch folgendes im HTML-Formular angegeben:
<form action="picturehandler" enctype="multipart/form-data" method="post">
Es gibt APIs zum Parsen des Datenstroms, das braucht man nicht mehr selbst zu machen (beispielsweise hier: http://jakarta.apache.org/commons/fileupload).
Des Weiteren sollte die service-Methode nicht überschrieben werden (Informationen dazu: http://www.jguru.com/faq/view.jsp?EID=8824).
-
Okay, aber würde ein
public void service( ... ) { super.service( ... ) }
das ganze nicht wieder reparieren ?
-
HändyÄndy schrieb:
Okay, aber würde ein
public void service( ... ) { super.service( ... ) }
das ganze nicht wieder reparieren ?
In deinem Fall gibt es keinen Grund in der service()-Methode rumzupfuschen. Überschreib doPost() und behandele den Rest da!
Ich empfehle außerdem für das Hochladen von Dateien die schon genannte API. Was du machst - einfach den Inputstream einlesen - führt sowieso nicht zum gewünschten Ergebnis.
-
Ich hab jetzt mal FileUpload installiert und das Standardbeispiel implementiert. Trotzdem wird keine Datei hochgeladen, weil die Dateiliste die Länge 0 hat.
<form action="picturehandler" method="post" enctype="multipart/form-data"> <input type="file" /> <input type="submit" value="Datei hochladen"/> </form>
PictureHandler.java
package requestHandler; import javax.servlet.http.*; import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.servlet.*; import org.apache.commons.fileupload.disk.*; import java.io.*; import java.util.*; public class PictureHandler extends HttpServlet { static final long serialVersionUID = 6; public void doPost( HttpServletRequest request , HttpServletResponse response ) { FileItemFactory ff = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload( ff ); if( ServletFileUpload.isMultipartContent( request ) ) { try { List filelist = upload.parseRequest( request ); System.out.println( "filelist.size():" + filelist.size() ); Iterator it = filelist.iterator(); while( it.hasNext() ) { FileItem pic = (FileItem) it.next(); String filename = pic.getName(); pic.write( new File( "/User/toom/Desktop/mypic/" , filename ) ); System.out.println("Datei geschrieben..."); } } catch ( Exception e ) { e.printStackTrace(); return; } } try { request.getRequestDispatcher("upload_pictures.jsp").forward( request , response ); return; } catch (Exception e) { e.printStackTrace(); } } }
Warum läuft es nicht, obwohl ich eine gültige Datei angegeben habe ?