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 ?


Anmelden zum Antworten