簡體   English   中英

使用 HttpClient4 上傳文件時設置 header “Content-Type”的問題

[英]Problem with setting header “Content-Type” in uploading file with HttpClient4

我正在嘗試將文件(或多個文件)上傳到我的 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 會將所有需要的信息添加到我的請求中(類似於我不這樣做時) t 指定內容類型)。

我的問題是:

  1. 為什么添加“Content-Type”會破壞我的請求? HttpClient 不應該向我定義的內容類型添加邊界元素嗎?

  2. 我應該明確地為我的請求設置“Content-Type”還是讓圖書館處理它?

  3. 如果我可以明確設置Content-Type ,您能否提供代碼片段?

  4. 如果我可以明確設置 Content-Type,為什么我應該在發布到某些 forms 時使用並更喜歡“multipart/form-data”而不是“application/x-www-form-urlencoded”?

PS:我發現了一些相關的問題,但沒有解決我的問題:

commons-upload 和 httpcomponent 客戶端的 ContentType 問題

如何查看 MultipartForm 請求的內容?

如果您有表單數據 enctype,則必須遵循RFC 2388中指定的規則。 多部分消息中的數據被視為實體,因此每個實體必須具有 header(帶有Content-DispositionContent-Type等)和邊界。

至於回答問題 1,RFC 指出:

與所有多部分 MIME 類型一樣,每個部分都有一個可選的“Content-Type”,默認為 text/plain。

對於 2),如前所述,每條多部分消息都必須具有 header,因此您必須指定 Content-Type(如果您沒有完全使用 HttpClient 庫功能)。

對於 3) 和 4) RFC 規定:

如果要返回多個文件作為單個表單條目的結果,它們應該表示為嵌入在“multipart/form-data”中的“multipart/mixed”部分。

希望這可以幫助。

到 fedd/ 插入隨機生成邊界的 class 是 HttpClient,而不是 HttpPost。 所以你應該看看 HttpClient 的方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM