使用Socket 完成HTTP post方式的文本及文件上傳 demo

         Android端和Web端的代碼下載

   代碼結構


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包,下面是官網地址:

   下載:commons-fileupload-XXX.jar

   下載:commons-io-XXX.jar

   在Web端的servlet裏的doPost方式中,判斷是普通表單還是上傳文件的表單,如果是上傳文件的表單才繼續,否則按照默認方式處理。

   打開commons-fileupload-XXX的用戶指南,根據文檔一步步完成文件上傳,在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的請求和響應,谷歌瀏覽器自帶的就很不錯哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章