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