1. 程式人生 > >使用Socket 完成HTTP post方式的文字及檔案上傳 demo

使用Socket 完成HTTP post方式的文字及檔案上傳 demo

   程式碼結構


Android端


Web端


最終結果

   該demo具有很強的通用性,而且程式碼的複用性極高,基本上以後不需要再為檔案上傳花費太多時間,拿過去直接可以用。

   剛開始從事android工作時,一進公司就是做檔案上傳,公司以前做直播、視訊及圖片相關的社交APP,需要上傳大量的圖片及視訊,雖然當時getpost上傳檔案最終弄出來了,但對其原理及方式始終一知半解,最近在加強學習這方面的知識,終於弄懂了,並編寫了一個demo。

         HttpUrlConnection具有快取功能,在上傳檔案資訊時,會將內容快取在記憶體中,因此很容易導致記憶體溢位,記憶體溢位是指申請不到夠用的記憶體空間,記憶體洩漏是指借用空間未歸還。

SocketHttpUrlConnection更底層,可以有效避免上傳檔案資訊的快取問題,因此本例中使用Socket來完成Httppost檔案上傳。

        Web端用到了2jar包來完成檔案上傳:commons-fileupload-XXX.jarcommons-io-XXX.jar,其實用到的是commons-fileupload-XXX.jar,但該jar包需要commons-io-XXX.jar的支援。可以在官網上下載這兩個jar包,下面是官網地址:

   在Web端的servlet裡的doPost方式中,判斷是普通表單還是上傳檔案的表單,如果是上傳檔案的表單才繼續,否則按照預設方式處理。

   開啟的使用者指南,根據文件一步步完成檔案上傳,在web端,我將得到的引數和值列印在了控制檯,表示處理完成。執行web端的demo可以很清晰的知道過程。

   在Android端,最核心部分便是檔案普通欄位的上傳,在這裡對應web端的form表單,傳入path,需要上傳的普通欄位的集合及檔案(可以是檔案陣列)即可,在demo中已經除錯好頭欄位及內容部分,先得到檔案型別及文字型別的總長度,再寫好頭欄位部分,將文字型別及檔案型別的內容依次寫給伺服器端,讀取伺服器響應的第一行,尋找200狀態碼判斷是否成功傳送即可。

   有以下幾點必須注意

         1、請求的url的獲取,請用cmd中輸入

ipconfig  獲取到ipv4對應的ip地址,就是我們要訪問的ip地址,有時會變。埠採用預設的8080埠。訪問的地址是Web端提供的。

         2、你可能需要上傳的不是png的圖片,在MainActivity中修改成對應的型別即可。

         3、你需要在清單檔案中申請許可權:訪問網路和讀取SD卡。

         4、網路等耗時操作必須在子執行緒中完成,更新UI需要在主執行緒完成,Toast也需要在主執行緒中完成。

         5、從頭自己寫post上傳檔案請求很容易出現小錯誤,導致Web端接收不到內容

         6、如果你沒有找到一個好的工具來觀察http的請求和響應,谷歌瀏覽器自帶的就很不錯哦!