转 使用 HttpClient 4 进行文件上传
http://www.tuicool.com/articles/Y7reYb
1. 概述本教程我們將描述如何使用?HttpClient 4進(jìn)行一次多文件上傳操作?. 我們將使用??http://echo.200please.com??作為測(cè)試服務(wù)器,因?yàn)樗敲嫦蚬姷?#xff0c;并且接受大多數(shù)類型的內(nèi)容. 如果你想要深入學(xué)習(xí)并了解你可以使用??HttpClient 做到的其它很棒的事情??– 那就去看看?首要的 HttpClient 教程吧???. 2. 使用??AddPart??方法讓我們開始研究研究??MultipartEntityBuilder??對(duì)象,來(lái)向一個(gè)Http實(shí)體添加成分,它在稍后將會(huì)被通過(guò)一個(gè)POST操作上傳. 這是向一個(gè)?HttpEntity添加成分來(lái)表示表單的一般方法?. 示例 2.1. - 使用兩個(gè)文本成分和一個(gè)文件上傳一個(gè)表單 File file = new File(textFileName, ContentType.DEFAULT_BINARY); HttpPost post = new HttpPost("http://echo.200please.com"); FileBody fileBody = new FileBody(file); StringBody stringBody1 = new StringBody("Message 1", ContentType.MULTIPART_FORM_DATA); StringBody stringBody2 = new StringBody("Message 2", ContentType.MULTIPART_FORM_DATA); // MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addPart("upfile", fileBody); builder.addPart("text1", stringBody1); builder.addPart("text2", stringBody2); HttpEntity entity = builder.build(); // post.setEntity(entity); HttpResponse response = client.execute(post);? 請(qǐng)注意我們也通過(guò)制定將會(huì)被服務(wù)器使用到的ContentType值來(lái)實(shí)例化File對(duì)象. 同樣還請(qǐng)注意??addPart??方法有兩個(gè)參數(shù),作用就像是表單的鍵值對(duì)?. 除非服務(wù)器端實(shí)際需要這些值并使用了這些參數(shù)名稱,它們就是有干系的,否則它們就會(huì)被簡(jiǎn)單的忽略掉. |
3. 使用??addBinaryBody??和??addTextBody??方法創(chuàng)建一個(gè)multipart實(shí)體更直接的方式就是使用??addBinaryBody??和??AddTextBody?? 方法. 這些方法服務(wù)于上傳文本,文件,字符數(shù)組和??InputStream??對(duì)象. 我們用了一個(gè)簡(jiǎn)單的例子來(lái)描述如何使用它們 . 示例 3.1. - 上傳一個(gè)文本和一個(gè)文本文件部分 HttpPost post = new HttpPost("http://echo.200please.com"); File file = new File(textFileName); String message = "This is a multipart post"; MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody("text", message, ContentType.DEFAULT_BINARY); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);? 注意這里不需要??FileBody??和??StringBody??對(duì)象 同樣重要的是,大多數(shù)服務(wù)器不會(huì)檢查文本體的??ContentType??, 因此??addTextBody?方法可能會(huì)忽略掉??ContentType??值 . ??addBinaryBody 的??API 接受一個(gè)??ContentType??- 但是它也有可能從一個(gè)二進(jìn)制體來(lái)創(chuàng)建實(shí)體,而對(duì)應(yīng)名稱的表單參數(shù)持有了這個(gè)文件. 如前面小節(jié)所述,如果ContentType值沒(méi)有被指定,一些服務(wù)器將不會(huì)識(shí)別這個(gè)文件. |
| 接下來(lái),我們將一個(gè)zip文件作為一個(gè)??InputStream 添加進(jìn)來(lái),??而圖片文件將會(huì)被作為File對(duì)象被添加進(jìn)來(lái): 示例 3.2. - 上傳一個(gè)Zip文件,一個(gè)圖片文件和一個(gè)文本?塊 HttpPost post = new HttpPost("http://echo.200please.com"); InputStream inputStream = new FileInputStream(zipFileName); File file = new File(imageFileName); String message = "This is a multipart post"; MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, imageFileName); builder.addBinaryBody ("upstream", inputStream, ContentType.create("application/zip"), zipFileName); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);? 請(qǐng)注意ContentType值可以被動(dòng)態(tài)創(chuàng)建,正如上面這個(gè)針對(duì)zip文件的示例中所示?. 最后,不是所有的服務(wù)器都接受??InputStream??部分. 我們?cè)诖a的第一行實(shí)體化的服務(wù)器可以接受?. 讓我們現(xiàn)在來(lái)看看另外一個(gè)示例,??addBinaryBody直接用于一個(gè)位數(shù)組??: 示例 3.3. - 上傳一個(gè)位數(shù)組和文本 HttpPost post = new HttpPost("http://echo.200please.com"); String message = "This is a multipart post"; byte[] bytes = "binary code".getBytes(); // MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("upfile", bytes, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);? 留意?ContentType??- 它現(xiàn)在被指定為二進(jìn)制數(shù)據(jù). 4. 總結(jié)本文呈現(xiàn)了??MultipartEntityBuilder 作為一個(gè)靈活的對(duì)象提供了創(chuàng)建一個(gè)??multipart 表單多種API. 示例同樣也展示了如何使用HttpClient上傳一個(gè)類似于表單實(shí)體的HttpEntity?. 這些示例的所有實(shí)現(xiàn)和代碼塊在??我的github項(xiàng)目??中可以找到 – 這是一個(gè)基于Eclipse的項(xiàng)目, 因此可以很容易的導(dǎo)入并運(yùn)行. |
轉(zhuǎn)載于:https://www.cnblogs.com/wikiki/p/4343737.html
總結(jié)
以上是生活随笔為你收集整理的转 使用 HttpClient 4 进行文件上传的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Eclipse | 使用
- 下一篇: JavaScript中七种函数调用方式及