【发布时间】:2011-06-02 08:56:16
【问题描述】:
我正在尝试将文件(或多个文件)上传到我的 servlet,它使用 Apache 文件上传来处理和获取发布的文件。
当我使用以下代码时,一切顺利,文件已发送和接收。
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()));
但是当我尝试将自己的“Content-Type”设置为推荐的一种(或仅被 Apache 文件上传库接受的一种)并上传文件时:
post.addHeader("Content-Type", "multipart/form-data");
我的 servlet 没有得到任何文件并抛出异常:
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)
我知道上传文件的 POST 请求不应在请求中包含边界“元素”以确定上传字节块的顺序,但我认为 HttpClient 会将所有需要的信息添加到我的请求中(类似于我没有指定内容类型)。
我的问题是:
为什么添加“Content-Type”会破坏我的请求? HttpClient不应该给我定义的content-type添加边界元素吗?
我应该明确地为我的请求设置“Content-Type”还是让库来处理它?
如果我可以明确设置
Content-Type,你能提供一个代码sn-p吗?如果我可以明确设置 Content-Type,为什么我应该使用“multipart/form-data”而不是“application/x-www-form-urlencoded”来发布某些表单?
PS:我发现了一些相关的问题,但没有解决我的问题:
ContentType issue with commons-upload and httpcomponent client
【问题讨论】:
标签: java file-upload httpclient