Problème avec la configuration de l'en-tête “Content-Type” téléchargement de fichier avec HttpClient4
Je suis en train de télécharger un fichier (ou plusieurs fichiers) à ma servlet, qui est à l'aide d'Apache de téléchargement de fichier et post-ed fichiers.
Tout va bien et que le fichier est envoyé et reçu, lorsque j'utilise le code suivant.
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()));
Mais quand j'essaie de régler mon propre "Content-Type" recommandé par l'un (ou l'une seulement accepté avec Apache chargement d'un fichier de bibliothèque) avec téléchargement du fichier:
post.addHeader("Content-Type", "multipart/form-data");
Ma servlet n'y a pas de fichiers et déclenche une exception:
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)
Je suis conscient que les requêtes POST avec le téléchargement de fichiers ne doivent pas contenir de frontière "éléments" à la demande afin de déterminer l'ordre de téléchargé octet morceaux, mais j'ai pensé HttpClient va ajouter toutes les informations nécessaires à ma demande (similaire que lorsque je n'ai pas de spécifier le type de contenu).
Mes questions sont:
-
Pourquoi ajouter "Content-Type" saut de ma demande? Ne devrait pas HttpClient ajouter des éléments de frontière pour le type de contenu défini par moi?
-
Dois-je définir explicitement "Content-Type" à ma demande ou laissez la bibliothèque manipuler?
-
Si je peux mettre
Content-Type
explicitement pourrait vous fournir un extrait de code? -
Si je peux explicitement défini le Type de Contenu d'pourquoi devrais-je utiliser et préfèrent "multipart/form-data", "application/x-www-form-urlencoded" quand il s'agit de l'Affichage de certaines formes?
PS: j'ai trouvé en quelque sorte liés à des questions, mais ne pas répondre à mon problème:
ContentType problème avec les communes-télécharger et httpcomponent client
Comment puis-je Voir le contenu d'un MultipartForm demande?
OriginalL'auteur ljader | 2011-06-02
Vous devez vous connecter pour publier un commentaire.
Si vous avez des données de formulaire enctype, vous devez suivre les règles comme spécifié dans RFC 2388. De données dans un message multipart sont traités comme une entité de sorte que chaque entité doit avoir un en-tête (avec
Content-Disposition
,Content-Type
, etc.) et une frontière.Pour répondre à la question 1, le RFC états:
Pour 2), Comme mentionné, chaque message multipart doit avoir un en-tête, de sorte que vous devez spécifier votre Type de Contenu (si vous n'êtes pas complètement à l'aide HttpClient les fonctionnalités de la bibliothèque).
Pour les 3) et 4) RFC états:
Espère que cette aide.
Heureux d'avoir eu de l'aide.
Je suis dans la même situation mais ne savait pas quoi faire. J'espérais que le MultipartEntity de raconter l'HttpPost objet qu'il est en plusieurs parties, les données de formulaire et avoir une certaine limite, et je ne le type de contenu d'ensemble par moi-même. Je n'ai pas très bien comment fournir des limites aux entités de la MultipartEntity ne dispose pas d'une méthode comme setBoundary. Ou, comment obtenir généré de façon aléatoire, limite de le spécifier dans addHeader par moi - même- pas getBoundary methor soit...
OriginalL'auteur Buhake Sindi
de fedd/la classe qui insère généré de façon aléatoire limite est HttpClient, pas HttpPost. donc, vous devriez regarder méthodes pour HttpClient
OriginalL'auteur Will