Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Html-Formular mit binary file an Servlet

Empfohlene Antworten

Veröffentlicht

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>

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)

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>

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...

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)

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

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.

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

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?

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>

Ich habe was gefunden. Und zwar ist das wohl ein Bug von Opera 5, der erst in Opera 5.12 behoben ist.

Gefunden habe ich das hier

Hi

Soso ist das also! Blödes opera ;) Ja dann versuchs ich halt mit nem anderen Browser!

Aber danke für die Hilfe!

Gruss Cyrill

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.