java boundary數據解析示例

#java解析多Boundary數據

近段時間的項目需要用到多boundary數據的接收處理。
剛開始對boundary和chunk是什麼東西都不理解!
後面通過一些同事的幫助和網址的查找,找到了一個相對來說比較滿意的解析框架。

##參考的用到的三個網址:

//解決方法的博客(英文):
https://stackoverflow.com/questions/13457503/library-and-examples-of-parsing-multipart-form-data-from-inputstream
//下載jar包的網址(英文);
http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
//下載另外一個jar包的網址(英文):
http://commons.apache.org/proper/commons-io/download_io.cgi

##我開發的代碼參考示例:

https://download.csdn.net/download/wenzhi20102321/10677435

##解析示例
###1.要解析的數據:

--AaB03x
Content-Disposition: form-data; name="json"
Content-Type: application/json

{"some":"json"}


--AaB03x
Content-Disposition: form-data; name="bin"
Content-Type: application/octet-stream

<file data>

//可以多個boundary數據

--AaB03x--


###2.解析數據的關鍵代碼:

   private void testUtil() {
        Log.e(TAG, "start testUtil");
      
        byte[] boundary = "AaB03x".getBytes();//開始的標識
        InputStream inputStream = getResources().openRawResource(R.raw.audio8);//要解析數據的流對象
		
        @SuppressWarnings("deprecation")
        MultipartStream multipartStream =
                new MultipartStream(inputStream, boundary);//傳入流對話和開始標識

        boolean nextPart = false;
        try {
            nextPart = multipartStream.skipPreamble();

            while (nextPart) {//不斷判斷數據,直到結束
                String header = multipartStream.readHeaders(); //拿到頭數據
                System.out.println("start--->");
                System.out.println("Headers:");
                System.out.println(header);
                System.out.println("Body:");
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                multipartStream.readBodyData(byteArrayOutputStream);
                byte[] body = byteArrayOutputStream.toByteArray();//拿到body的數據
                System.out.println(new String(body));
                System.out.println("--->end");
                nextPart = multipartStream.readBoundary();
            }
        } catch (Exception e) {
            Log.e(TAG, "testUtil err: " + e.getMessage());
        }
		
        Log.e(TAG, "end testUtil");
    }


###3.解析得到的結果

start testUtil
start--->
Headers:
Content-Disposition: form-data; name="json"
Content-Type: application/json
Body:
{"some":"json"}
--->end
start--->
Headers:
Content-Disposition: form-data; name="bin"
Content-Type: application/octet-stream
Body:
<file data>
--->end
end testUtil

能夠把示例數據中的Header和Body數據都分離出來了!

###4.解析數據幾個關鍵的地方說明

####(1)上面的框架使用到了兩個jar包,可以我的示例代碼,或者我參考的網址。
####(2)要解析的數據要注意的幾點:


開始標識的字符串要單獨一行。
每個boundary的header和body數據也好相隔一行。
開始標識前面有兩個--要去掉,如果多於兩個的話,去掉前面兩個就可以了。


我項目中需要接收音頻數據,所以不能轉爲String,上面只是爲了演示顯示。
音頻數據如果轉爲String是有問題,即使再轉回byte數據,也可能不是原來的數據了。
解析的框架,其實讀取的是流數據,
通過讀取裏面的回車換行數據進行數據分割,並不斷返回數據。

這裏簡單說一些boundary和chunk的簡單關係:


如果長的數據,服務器端傳過來的都是多chunk數據
chunk,其實就是表示片段的意思。

boundary是在客戶端顯示的數據的格式形式
每個boundary都有一些固定的格式,比如包含header和body


一個chunk可以多個boundary,比如兩個三個。。。

但是一個boundary也可以多個chunk數據,
這種情況主要是,boundary中的body數據比較長,可以分爲多個chunk


#共勉:態度決定人生的高度。

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