請尊重他人的勞動成果,轉載請注明出處:[](http://blog.csdn.net/fengyuzhengfan/article/details/39941851)[Android網絡編程之使用HttpClient批量上傳文件](http://blog.csdn.net/fengyuzhengfan/article/details/39941851)
我曾在《[Android網絡編程之使用HTTP訪問網絡資源](http://blog.csdn.net/fengyuzhengfan/article/details/38919259)》一文中介紹過HttpCient的使用,這里就不在累述了,感興趣的朋友可以去看一下。在這里主要介紹如何通過HttpClient實現文件上傳。
## 1.預備知識:
在HttpCient4.3之前上傳文件主要使用MultipartEntity這個類,但現在這個類已經不在推薦使用了。隨之替代它的類是MultipartEntityBuilder。
### 下面讓我們了解一下MultipartEntityBuilder類:
MultipartEntityBuilder這個類主要用于創建HttpEntity。它的主要方法有:
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse; border:none"><tbody><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border:solid #8EAADB 1.0pt; border-left:none; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span style="font-size:9.0pt; font-family:宋體; color:#353833">修飾符和類型</span><span lang="EN-US" style="font-size:9.0pt; font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border-top:solid #8EAADB 1.0pt; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:none; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span style="font-size:9.0pt; font-family:宋體; color:#353833">方法和描述</span><span lang="EN-US" style="font-size:9.0pt; font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">addBinaryBody</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">(</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">String</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?name, byte[]?b)</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p><p class="MsoNormal" align="left" style="text-align:left"><span style="font-family:宋體; color:#353833">將字節數組以二進制的形式添加數據。</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">addBinaryBody</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">(</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">String</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?name, byte[]?b,?</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">ContentType</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?contentType,?</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">String</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?filename)</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p><p class="MsoNormal" align="left" style="text-align:left"><span style="font-family:宋體; color:#353833">將字節數組以二進制的形式添加數據。</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">addBinaryBody</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">(</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">String</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?name,?</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">File</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?file)</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p><p class="MsoNormal" align="left" style="text-align:left"><span style="font-family:宋體; color:#353833">將文件以二進制的形式添加數據。</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">addBinaryBody</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">(</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">String</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?name,?</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">File</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?file,?</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">ContentType</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?contentType,?</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">String</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?filename)</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p><p class="MsoNormal" align="left" style="text-align:left"><span style="font-family:宋體; color:#353833">將文件以二進制的形式添加數據。</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">addBinaryBody</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">(</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">String</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?name,?</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">InputStream</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?stream)</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">addBinaryBody</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">(</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">String</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?name,?</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">InputStream</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?stream,?</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">ContentType</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?contentType,?</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">String</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?filename)</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p><p class="MsoNormal" align="left" style="text-align:left"><span style="font-family:宋體; color:#353833">將輸入流以二進制的形式添加數據。</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">addPart</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">(</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">String</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?name,?</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">ContentBody</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?contentBody)</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p><p class="MsoNormal" align="left" style="text-align:left"><span style="font-family:宋體; color:#353833">添加</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">ContentBody</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?</span><span style="font-family:宋體; color:#353833">類型的數據。</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">addTextBody</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">(</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">String</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?name,?</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">String</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?text)</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p><p class="MsoNormal" align="left" style="text-align:left"><span style="font-family:宋體; color:#353833">添加文本數據。</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">addTextBody</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">(</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">String</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?name,?</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">String</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?text,?</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">ContentType</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?contentType)</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p><p class="MsoNormal" align="left" style="text-align:left"><span style="font-family:宋體; color:#353833">以指定的內容類型添加文本數據。</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">HttpEntity</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">build</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">()</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p><p class="MsoNormal" align="left" style="text-align:left"><span style="font-family:宋體; color:#353833">創建一個</span><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">HttpEntity</span></span><span style="font-family:宋體; color:#4C6B87">。</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US" style="font-family:宋體; color:#353833">static?</span><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">create</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">()</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p><p class="MsoNormal" align="left" style="text-align:left"><span style="font-family:宋體; color:#353833">創建一個</span><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span style="font-family:宋體; color:#4C6B87">對象。</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">setBoundary</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">(</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">String</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?boundary)</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p><p class="MsoNormal" align="left" style="text-align:left"><span style="font-family:宋體; color:#353833">設置邊界。</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">setCharset</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">(</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">Charset</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?charset)</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p><p class="MsoNormal" align="left" style="text-align:left"><span style="font-family:宋體; color:#353833">設置請求的編碼格式。</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">setLaxMode</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">()</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">setMode</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">(</span><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">HttpMultipartMode</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">?mode)</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p><p class="MsoNormal" align="left" style="text-align:left"><span style="font-family:宋體; color:#353833">設置模式。</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></p></td></tr><tr style=""><td width="132" nowrap="nowrap" valign="top" style="width:99.25pt; border-top:none; border-left:none; border-bottom:solid #8EAADB 1.0pt; border-right:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><strong><span lang="EN-US"><span style="font-family:宋體; color:#4C6B87; text-decoration:none">MultipartEntityBuilder</span></span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833"/></strong></p></td><td width="425" valign="top" style="width:318.95pt; border:none; border-bottom:solid #8EAADB 1.0pt; background:#D9E2F3; padding:0cm 5.4pt 0cm 5.4pt"><p class="MsoNormal" align="left" style="text-align:left"><span lang="EN-US"><strong><span style="font-family:宋體; color:#4C6B87; text-decoration:none">setStrictMode</span></strong></span><span lang="EN-US" style="font-family:宋體; color:#353833">()</span><span lang="EN-US" style="font-family:'Arial','sans-serif'; color:#353833">?</span></p></td></tr></tbody></table>
主要方法說明:
**addBinaryBody**、**addPart**、**addTextBody**方法用于添加要上傳的數據,從上面的表格中可以發現用于添加數據的方法,都是**key-value**類型。所以在服務器端我們可以通過request.getPart("keyname")方式獲取對應key的數據。也可以通過request.getParts()方式獲取客戶端通過以上三種方法提交所有數據。
1.通過**addBinaryBody**方法直接可以添加**File、InputStream、byte[]**類型的數據。
2.通過**addPart**方法只能添加**ContentBody**類型的數據,在org.apache.http.entity.mime.content包中已經提供了**String**、**File**以及**InputStream**對應的**ContentBody**類型的子類,如FileBody、InputStreamBody、StringBody,通過這些類我們可以將**String**、File以及**InputStream**類型的數據轉換成**ContentBody**類型的數據。
3.通過**addTextBody**方法我們可以很方便的添加文本數據。
## 2.通過HttpCient上傳文件
Android端需要添加[httpcore-4.3.2.jar](http://download.csdn.net/detail/fengyuzhengfan/8018277)、[httpmime-4.3.5.jar](http://download.csdn.net/detail/fengyuzhengfan/8018281)兩個包。兩個包缺一不可。
在這里我用的是最新版的**HttpCient**,大家可以從[http://hc.apache.org/downloads.cgi](http://download.csdn.net/detail/fengyuzhengfan/8018289)上下載所需要的jar包,如果上面的網站打不開,大家也不用擔心,我已經將項目中所需要的jar包上傳到CSDN上《[httpcomponents-client-4.3.5-bin.zip](http://download.csdn.net/detail/fengyuzhengfan/8018289)》需要的朋友可以去下載。
### Android端項目核心代碼:
~~~
HttpClient client=new DefaultHttpClient();// 開啟一個客戶端 HTTP 請求
HttpPost post = new HttpPost(url);//創建 HTTP POST 請求
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
// builder.setCharset(Charset.forName("uft-8"));//設置請求的編碼格式
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//設置瀏覽器兼容模式
int count=0;
for (File file:files) {
// FileBody fileBody = new FileBody(file);//把文件轉換成流對象FileBody
// builder.addPart("file"+count, fileBody);
builder.addBinaryBody("file"+count, file);
count++;
}
builder.addTextBody("method", params.get("method"));//設置請求參數
builder.addTextBody("fileTypes", params.get("fileTypes"));//設置請求參數
HttpEntity entity = builder.build();// 生成 HTTP POST 實體
post.setEntity(entity);//設置請求參數
HttpResponse response = client.execute(post);// 發起請求 并返回請求的響應
if (response.getStatusLine().getStatusCode()==200) {
return true;
}
return false;
~~~
代碼分析:?
上面代碼主要實現了多文件上傳,為了方便服務器端保存文件,上面代碼設置了名稱為fileTypes的參數,fileTypes是由上傳的文件類型名拼接成的字符串,如”.jpg.png.docx“;
服務器端可以通過獲取名為fileTypes的參數,然后將其拆分成字符數組,即可得到要保存文件的類型。
### 服務器端項目核心代碼:
服務器段主要用到Servlet3.0的API,主要用到的方法有:
1.request.getParameter("");//獲取客戶端通過addTextBody方法添加的String類型的數據。
2.request.getPart("");//獲取客戶端通過**addBinaryBody**、**addPart**、**addTextBody**方法添加的指定數據,返回Part類型的對象。
3.request.getParts();//獲取客戶端通過**addBinaryBody**、**addPart**、**addTextBody**方法添加的所有數據,返回**Collection<Part>**類型的對象。
4.part.getName();//獲取上傳文件的名稱即上傳時指定的key。
5.part.getSize()//獲取上傳文件的大小單位為字節。
~~~
String fileTypes=request.getParameter("fileTypes");//獲取客戶端上傳的所有文件類型
String[]typeArray=fileTypes.substring(1).split("\\.");//將文件類型字符串拆分成String數組
try {
Iterator<Part>iterator=request.getParts().iterator();
int count=0;
while (iterator.hasNext()) {//遍歷客戶端上傳的所有文件
if (count>=typeArray.length)break;//如果超出文件類型數組的大小則跳出循環
Part part = (Part) iterator.next();
// System.out.println("part.getSize()"+part.getSize());//獲取上傳文件的大小
// System.out.println("part.getName()"+part.getName());//獲取上傳文件的名及添加數據時的key名
File file=new File("E:\\upload\\"+count+"."+typeArray[count++]);
InputStream inputStream=part.getInputStream();
FileOutputStream fos=new FileOutputStream(file);
byte[]buffer=new byte[1024];
int len=0;
while ((len=inputStream.read(buffer))!=-1) {
fos.write(buffer,0, len);
}
inputStream.close();
fos.close();
}
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
~~~
代碼分析:
服務器端是通過Servlet實現的,通過調用request.getParameter("fileTypes")方法來獲取客戶端上傳的所有文件類型,然后將文件類型字符串拆分成String數組。通過request.getParts()方法取出客戶端通過**addBinaryBody**、**addPart**、**addTextBody**上傳的所有數據,然后遍歷數據集合即可進行文件的保存。
由于事先和客戶端協定,添加上傳文件的順序在添加請求參數之前,所以可以根據拆分出的文件類型數組的長度判斷出客戶端上傳文件的個數,因此當上面代碼遍歷超出了類型數組的長度時程序跳出循環,不再進行文件的保存,因為下面的Part都是些參數,而不是要保存的文件了。
## 程序運行效果圖:

## 3.完成項目代碼:
MainActivity.java
~~~
package com.jph.ufh.activity;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import com.jph.ufh.R;
import com.jph.ufh.service.UploadService;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Toast;
/**
* 通過httpClient批量上傳文件
* @author jph
* Date:2014.10.09
*/
public class MainActivity extends Activity {
private ArrayList<File>files;
private Map<String, String>params;
Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
case UploadService.UPLOAD_SUCCESS:
Toast.makeText(MainActivity.this, "上傳成功", Toast.LENGTH_LONG).show();
break;
}
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
files=new ArrayList<File>();
params=new HashMap<String, String>();
}
public void upload(View v) {
files.clear();
params.clear();
File file=new File(Environment.getExternalStorageDirectory(),"kaola.jpg");
File file2=new File(Environment.getExternalStorageDirectory(),"test.docx");
File file3=new File(Environment.getExternalStorageDirectory(),"test.jpg");
files.add(file);
files.add(file2);
files.add(file3);
StringBuffer sbFileTypes=new StringBuffer();
for (File tempFile:files) {
String fileName=tempFile.getName();
sbFileTypes.append(getFileType(fileName));
}
params.put("fileTypes",sbFileTypes.toString());
params.put("method", "upload");
UploadService uploadService=new UploadService(mHandler);
uploadService.uploadFileToServer(params, files);
}
/**
* 獲取文件的類型
* @param fileName :文件名
* @return 文件類型
*/
private String getFileType(String fileName) {
// TODO Auto-generated method stub
return fileName.substring(fileName.lastIndexOf("."), fileName.length());
}
}
~~~
**UploadService.java**
~~~
package com.jph.ufh.service;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.DefaultHttpClient;
import android.os.Handler;
/**
* 采用HttpClient上傳文件,支持多文件上傳
* @author jph
* Date:2014.10.09
*/
public class UploadService {
private static String url="http://10.219.57.16:8080/ServerForUpload/ServletForUpload";
// private static String url="http://10.110.6.58:8080/ServerForUpload/ServletForUpload";
public static final int UPLOAD_SUCCESS=0x123;
public static final int UPLOAD_FAIL=0x124;
private Handler handler;
public UploadService(Handler handler) {
// TODO Auto-generated constructor stub
this.handler=handler;
}
/**
* @param params 請求參數,包括請求的的方法參數method如:“upload”,
* 請求上傳的文件類型fileTypes如:“.jpg.png.docx”
* @param files 要上傳的文件集合
*/
public void uploadFileToServer(final Map<String, String> params, final ArrayList<File>files) {
// TODO Auto-generated method stub
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
if (uploadFiles(url,params,files)) {
handler.sendEmptyMessage(UPLOAD_SUCCESS);//通知主線程數據發送成功
}else {
//將數據發送給服務器失敗
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
/**
* @param url servlet的地址
* @param params 要傳遞的參數
* @param files 要上傳的文件
* @return true if upload success else false
* @throws ClientProtocolException
* @throws IOException
*/
private boolean uploadFiles(String url,Map<String, String>params,ArrayList<File>files) throws ClientProtocolException, IOException {
HttpClient client=new DefaultHttpClient();// 開啟一個客戶端 HTTP 請求
HttpPost post = new HttpPost(url);//創建 HTTP POST 請求
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
// builder.setCharset(Charset.forName("uft-8"));//設置請求的編碼格式
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//設置瀏覽器兼容模式
int count=0;
for (File file:files) {
// FileBody fileBody = new FileBody(file);//把文件轉換成流對象FileBody
// builder.addPart("file"+count, fileBody);
builder.addBinaryBody("file"+count, file);
count++;
}
builder.addTextBody("method", params.get("method"));//設置請求參數
builder.addTextBody("fileTypes", params.get("fileTypes"));//設置請求參數
HttpEntity entity = builder.build();// 生成 HTTP POST 實體
post.setEntity(entity);//設置請求參數
HttpResponse response = client.execute(post);// 發起請求 并返回請求的響應
if (response.getStatusLine().getStatusCode()==200) {
return true;
}
return false;
}
}
~~~