Zum Inhalt springen

Html-Formular mit binary file an Servlet


Empfohlene Beiträge

Geschrieben

Hallo,

ich habe ein html-Formular, mit dem ich ein file an ein Servlet schicken will.

Das html-file sieht ungefähr so aus

...

 <form action="servlet/XmlInputServlet" method=post enctype="multipart/form-data">

<p>Senden Sie eine Xml-Datei an den Host!</p>

<input type=file size=1000 maxlength=50 name="file"><br>

<input type=submit value="Absenden">

</form>

...

 
Das Servlet wird korrekt aufgerufen. Allerdings kommen da anscheinend keine Parameter an. Zumindest bekomme ich das File nicht. Meine doPost methode im Servlet sieht so aus (soll erstmal gucken, überhaupt parameter ankommen:
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)

    throws ServletException, IOException {


    PrintWriter out = resp.getWriter();

    Enumeration tempEnumeration = req.getParameterNames();

    while (tempEnumeration.hasMoreElements()) {

        System.out.println("Element: " + tempEnumeration.nextElement());

    }

} 

Weiß jemand Rat???

Danke

Gruß

Mirko

<FONT COLOR="#a62a2a" SIZE="1">[ 19. Dezember 2001 16:00: Beitrag 1 mal editiert, zuletzt von Mirko ]</font>

Geschrieben

Hi

Ja das kenne ich.. bin sozusagen auch gerade daran dieses Problem zu lösen einfach ein wenig weiter.. aber noch nicht ganz gelöst ;)

Aber da du das Formular mit enctype an den Server schickst musst du es auch speziell empfangen und zwar hat da oreilly ein gutes Servlet gebastelt das du so ungefäht übernhemen kannst!

http://www.servlets.com/cos/index.html

Mit dem MultipartParser kannst du diesen speziellen Request empfang und bearbeiten..

http://www.servlets.com/cos/javadoc/com/oreilly/servlet/multipart/MultipartParser.html

Hier musst du dann überprüfen ob es ein File oder Parameter ist und dann speziell weiterverarbeiten.. und da bin ich jetzt auch stehen geblieben.. und zwar bekomme ich immer einen Fehler mit dem Boundary vielleicht kann mir da jemand helfen.

Fehler:

******************************

[exec] Parse error, missing : in oundary=_OPERAB__-eQNKLp7oUo3j0vyFLfbHCX

[exec]

[exec] Full POST /geonet/servlet/ch.unizh.geo.geonet.ImageUploader HTTP/1.1

[exec] User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Linux 2.2.18 i686) Opera 5.0 [en]Host: localhost:8080Accept: text/html, image/png, image/jpeg, image/gif, image/x-xbitmap, */*Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0Referer: http://localhost:8080/geonet/servlet/ch.unizh.geo.geonet.HelptextControllerCookie: $Version=1; JSESSIONID=snr4n7qf21; $Path="/geonet"Connection: Keep-Alive, TETE: deflate, gzip, chunked, identity, trailersContent-length: 23017Content-Type: multipart/form-data; boundary=_OPERAB__-eQNKLp7oUo3j0vyFLfbHCX

[exec]

[exec] HelptextController.doPost(): req :org.apache.tomcat.facade.HttpServletRequestFacade@7e6a96

[exec] java.io.IOException: Separation boundary was not specified

[exec] at com.oreilly.servlet.multipart.MultipartParser.<init>(MultipartParser.java:135)

[exec] at com.oreilly.servlet.multipart.MultipartParser.<init>(MultipartParser.java:83)

[exec] at ch.unizh.geo.geonet.ImageUploader.doPost(ImageUploader.java:40)

[exec] at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)

[exec] at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

[exec] at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:405)

[exec] at org.apache.tomcat.core.Handler.service(Handler.java:287)

[exec] at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)

[exec] at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:812)

[exec] at org.apache.tomcat.core.ContextManager.service(ContextManager.java:758)

[exec] at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:213)

[exec] at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)

[exec] at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:501)

[exec] at java.lang.Thread.run(Thread.java:484)

Geschrieben

Das ist ja schon mal ein guter Tipp. Da währe ich ja nicht drauf gekommen, dass das so kompliziert ist.

Ich habe mir die Klassen runtergeladen und mal in mein Visual Age importiert.

Naja, ich wühle mich mal weiter da durch.

Bist du schon weitergekommen??

<FONT COLOR="#a62a2a" SIZE="1">[ 20. Dezember 2001 08:08: Beitrag 1 mal editiert, zuletzt von Mirko ]</font>

Geschrieben

Also bei mir klappt das jetzt so. Bei mir geht es nur darum, das File in ein bestimmtes Verzeichnis auf dem Server abzulegen.

und das funktioniert hiermit:

 protected void doPost(HttpServletRequest req, HttpServletResponse resp)

    throws ServletException, IOException {

    MultipartParser tempParser = new MultipartParser(req, MAX_FILE_SIZE);

    Part tempPart;

    FilePart tempFilePart;


    tempPart = tempParser.readNextPart();

    if (tempPart != null) {

        if (tempPart instanceof FilePart) {

            tempFilePart = (FilePart) tempPart;

            tempFilePart.writeTo(new FileOutputStream("c://xmltest//input//" + tempFilePart.getFileName()));

        } else {

            resp.sendError(400, "The servlet recieved a wrong paramter");

        }

    } else {

        resp.sendError(400, "The servlet did not recieve a file");

    }


} 

Das Error-handling ist noch nicht so ganz sauber. Aber immerhin landet das File schon mal da, wo es soll.

Danke nochmal für deine Hilfe.

Schick doch mal Auszüge aus deinem Code, vielleicht finde ich ja den Fehler...

Geschrieben

Hi

Mein Code:

************************************


public void doPost(HttpServletRequest req, HttpServletResponse res)

			throws ServletException, IOException

	{

		if (DEBUG) System.out.println("HelptextController.doPost(): req:" + req );


		try

		{


			MultipartParser multipart = new MultipartParser(req, 1024*10*10);


			Hashtable parameters = new Hashtable();

			String mtype = null;

			InputStream is;

			Part p;


			while ((p = multipart.readNextPart()) != null)

			{

				if(p.isFile())

				{

					FilePart fp = (FilePart) p;

					mtype = fp.getContentType();

					is =	fp.getInputStream();				

				}

				if(p.isParam())

				{

					ParamPart pp = (ParamPart) p;

					parameters.put(pp.getName(), pp.getStringValue());				

				}			

			}


			if (DEBUG) System.out.println("Mtype :" + mtype);


			String checksecond = (String) parameters.get("checksecond");

			if (DEBUG) System.out.println("Checksecond :" + checksecond);




		}

		catch (Exception e)

		{

			if (DEBUG) e.printStackTrace();		

		}

	}

*******************************************

Error den es gibt:

*******************************************

[exec] HelptextController.doPost(): req :org.apache.tomcat.facade.HttpServletRequestFacade@2e533a

[exec] java.io.IOException: Posted content type isn't multipart/form-data

[exec] at com.oreilly.servlet.multipart.MultipartParser.<init>(MultipartParser.java:119)

[exec] at com.oreilly.servlet.multipart.MultipartParser.<init>(MultipartParser.java:83)

[exec] at ch.unizh.geo.geonet.ImageUploader.doPost(ImageUploader.java:40)

[exec] at ch.unizh.geo.geonet.ImageUploader.doGet(ImageUploader.java:29)

[exec] at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)

[exec] at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

[exec] at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:405)

[exec] at org.apache.tomcat.core.Handler.service(Handler.java:287)

[exec] at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)

[exec] at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:812)

[exec] at org.apache.tomcat.core.ContextManager.service(ContextManager.java:758)

[exec] at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:213)

[exec] at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)

[exec] at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:501)

[exec] at java.lang.Thread.run(Thread.java:484)

[exec] Parse error, missing : in oundary=_OPERAB__-spr8CUaj5qCxZViWW9oHLS

[exec]

[exec] Full POST /geonet/servlet/ch.unizh.geo.geonet.ImageUploader HTTP/1.1

[exec] java.io.IOException: Separation boundary was not specified

[exec] at com.oreilly.servlet.multipart.MultipartParser.<init>(MultipartParser.java:135)

[exec] at com.oreilly.servlet.multipart.MultipartParser.<init>(MultipartParser.java:83)

[exec] at ch.unizh.geo.geonet.ImageUploader.doPost(ImageUploader.java:40)

[exec] User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Linux 2.2.18 i686) Opera 5.0 [en]Host: localhost:8080Accept: text/html, image/png, image/jpeg, image/gif, image/x-xbitmap, */*Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0Referer: http://localhost:8080/geonet/servlet/ch.unizh.geo.geonet.HelptextControllerCookie: $Version=1; JSESSIONID=lk9atntsd1; $Path="/geonet"Connection: Keep-Alive, TETE: deflate, gzip, chunked, identity, trailersContent-length: 23023Content-Type: multipart/form-data; boundary=_OPERAB__-spr8CUaj5qCxZViWW9oHLS

[exec] at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)

[exec] at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

[exec] at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:405)

[exec] at org.apache.tomcat.core.Handler.service(Handler.java:287)

[exec] at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)

[exec] at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:812)

[exec] at org.apache.tomcat.core.ContextManager.service(ContextManager.java:758)

[exec] at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:213)

[exec] at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)

[exec] at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:501)

[exec] at java.lang.Thread.run(Thread.java:484)

*******************************************

Geschrieben

Hi,

kann es sein, dass du im Formular nicht den richtigen enctype angegeben hast:

... enctype="multipart/form-data" ...

Den brauchst du glaube ich, wenn du eine Datei übersenden willst.

Geschrieben

Hi

Nein, den hab ich auch...

ähm ich hab gerdae bemerkt das ich einen falschen Error oder sozusagen zuviel im forum gepostet habe. es gibt nur folgendne error:

###########

[exec] Parse error, missing : in oundary=_OPERAB__-/+/MwdkBK7OqAODFVteccF

[exec]

[exec] Full POST /geonet/servlet/ch.unizh.geo.geonet.ImageUploader HTTP/1.1

[exec] java.io.IOException: Separation boundary was not specified

[exec] at com.oreilly.servlet.multipart.MultipartParser.<init>(MultipartParser.java:135)

[exec] User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Linux 2.2.18 i686) Opera 5.0 [en]Host: localhost:8080Accept: text/html, image/png, image/jpeg, image/gif, image/x-xbitmap, */*Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0Referer: http://localhost:8080/geonet/servlet/ch.unizh.geo.geonet.HelptextControllerCookie: $Version=1; JSESSIONID=upc52odnn1; $Path="/geonet"Connection: Keep-Alive, TETE: deflate, gzip, chunked, identity, trailersContent-length: 23024Content-Type: multipart/form-data; boundary=_OPERAB__-/+/MwdkBK7OqAODFVteccF

[exec] at com.oreilly.servlet.multipart.MultipartParser.<init>(MultipartParser.java:83)

[exec] at ch.unizh.geo.geonet.ImageUploader.doPost(ImageUploader.java:40)

[exec] at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)

[exec] at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

[exec] at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:405)

[exec] at org.apache.tomcat.core.Handler.service(Handler.java:287)

[exec] at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)

[exec] at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:812)

[exec] at org.apache.tomcat.core.ContextManager.service(ContextManager.java:758)

[exec] at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:213)

[exec] at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)

[exec] at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:501)

[exec] at java.lang.Thread.run(Thread.java:484)

[exec]

[exec] HelptextController.doPost(): req :org.apache.tomcat.facade.HttpServletRequestFacade@2e533a

Geschrieben

Tja, wo der Fehler auftritt hast du ja wahrscheinlich auch schon rausgefunden:

   /**

   * Extracts and returns the boundary token from a line.

   * 

   * @return the boundary token.

   */

  private String extractBoundary(String line) {

    // Use lastIndexOf() because IE 4.01 on Win98 has been known to send the

    // "boundary=" string multiple times.  Thanks to David Wall for this fix.

    int index = line.lastIndexOf("boundary=");

    if (index == -1) {

      return null;

    }

    String boundary = line.substring(index + 9);  // 9 for "boundary="

    if (boundary.charAt(0) == '"') {

      // The boundary is enclosed in quotes, strip them

      index = boundary.lastIndexOf('"');

      boundary = boundary.substring(1, index);

    }


    // The real boundary is always preceeded by an extra "--"

    boundary = "--" + boundary;


    return boundary;

  } 

Das scheint ja abhängig von Browser und Betriebssystem zu sein. Nur warum fehlt dieser Boundary ja anscheinende komplett.

Wie sieht denn dein Formular aus?

Geschrieben

Hi

Momentan arbeite ich eigetnlich vorallem mit dem Opera Browser.

Es sollte schon gehen das auch noch ander eFelder mit übergeben werden oder?

Cyrill

Formular:

<form action="ch.unizh.geo.geonet.ImageUploader" method="post" enctype="multipart/form-data">

<input type="hidden" name="checksecond" value="new">

<input type="file" name="bilddatei"><br>

<input type="text" name="bildname" maxlength="500">Imagename<br>

<input type="text" name="descr" maxlength="500">Description<br>

<input type="text" name="comm" maxlength="500">Comments<br>

<br>

<input type="radio" name="image" value="nimage" >Insert no more Images<br>

<input type="radio" name="image" value="image" >Insert more Images<br><br>

<input type="submit" name="submit" value="Insert Image">

</form>

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...