#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
#共勉:態度決定人生的高度。