Problem mit dem setzen der header "Content-Type" in das hochladen-Datei mit HttpClient4
Ich versuche einen upload-Datei (oder mehrere Dateien) an meinen servlet, Apache Datei-upload zu behandeln und erhalten post-ed-Dateien.
Alles gut geht und die Datei senden und empfangen, wenn ich den folgenden code verwenden.
DefaultHttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://myservice.com/servlet");
MultipartEntity entity2 = new MultipartEntity();
FileBody fileBody = new FileBody(new File("C:/docOut.pdf"));
entity2.addPart("file", fileBody);
post.setEntity(entity2);
HttpResponse httpResponse = client.execute(post);
System.out.println(EntityUtils.toString(httpResponse.getEntity()));
Aber wenn ich versuche, meinen eigenen "Content-Type" empfohlen (oder man nur akzeptiert der Apache-Datei-upload-Bibliothek) mit dem hochladen der Datei:
post.addHeader("Content-Type", "multipart/form-data");
Mein servlet nicht alle Dateien und wirft eine Ausnahme:
org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:931)
at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331)
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:349)
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
at com.myservice.server.filerep.action.FileUploadFormAction.execute(FileUploadFormAction.java:54)
at com.myservice.server.filerep.web.FileRepServlet.doGet(FileRepServlet.java:34)
at com.myservice.server.filerep.web.FileRepServlet.doPost(FileRepServlet.java:41)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
Ich bin mir bewusst, dass POST-Anfragen mit dem hochladen der Datei sollte nicht enthalten-Grenze "Elemente" in der Anfrage, um zu bestimmen, die Reihenfolge der hochgeladenen byte-Blöcken, aber ich dachte, HttpClient wird alle benötigten Informationen auf meine Anfrage (ähnlich, wie wenn ich nicht angeben content-type).
Meine Fragen sind:
- Warum hinzufügen "Content-Type" Pause meine Anfrage? Sollte nicht HttpClient hinzufügen, boundary-Elemente, content-type definiert von mir?
- Sollte ich ausdrücklich festgelegt "Content-Type" auf meine Anfrage oder lassen Sie die Bibliothek umgehen?
- Wenn ich einstellen kann
Content-Type
ausdrücklich könnten Sie ein code-snippet? - Wenn ich ausdrücklich festgelegt, Content-Typ, warum sollte ich verwenden und lieber "multipart/form-data" auf "application/x-www-form-urlencoded", wenn es um die Veröffentlichung für einige Formen?
PS: ich fand die irgendwie im Zusammenhang Fragen, aber nicht auf mein problem:
ContentType Problem mit den commons-upload und httpcomponent client
Wie kann ich den Inhalt einer MultipartForm Anfrage?
InformationsquelleAutor ljader | 2011-06-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie Daten in das Formular enctype, Sie müssen die Regeln befolgen wie angegeben in RFC 2388. Daten in die multipart-Nachricht behandelt werden, als Person, so dass jede Entität muss einen header (mit
Content-Disposition
,Content-Type
usw.) und eine Grenze.Als Antwort zur Frage 1, die RFC-Staaten:
2), Wie bereits erwähnt, jeder multipart-Nachricht muss einen header, so dass Sie geben Sie Ihre Content-Typ (wenn Sie nicht vollständig mit HttpClient library-Funktionen).
Für 3) und 4) RFC-Staaten:
Hoffe, das hilft.
Froh zu helfen.
Ich bin in der gleichen situation aber nicht verstehen, was zu tun ist. Ich hatte gehofft, dass die MultipartEntity würde sagen, die HttpPost Objekt, es ist multipart Formulardaten und haben einige Grenze, und ich würde Inhaltstyp von mir. Ich habe nicht ganz verstanden, wie Grenzen, um den Personen - die MultipartEntity nicht eine Methode wie setBoundary. Oder, wie zu bekommen, dass zufällig generierte Grenze angeben, in addHeader von mir - keine getBoundary methor entweder...
InformationsquelleAutor Buhake Sindi
zu fedd/die Klasse, die Einsätze werden zufällig generiert-Grenze ist HttpClient, nicht HttpPost. so sollten Sie sich Methoden für HttpClient
InformationsquelleAutor Will