java 套接字如何读取综合类型的数据并分割数据

场景:使用socket 模拟处理http的post请求
1、http请求使用form/data的形式。
2、http请求中含有文件上传,文件类型不固定
问题:
http上传的时候,body里既包含文本又包含文件内容(文件内容不是文本)。在java里使用什么样的函数来进行读取这样的数据(既有文本又有文件内容),http的postdata中使用boundary的形式分割。怎么将这些内容分割,小弟对java不熟,恳请各位哥哥姐姐帮助

评论 (0)链接2012-10-01 

无论是文本还是你所说的文件内容,其实最终都是以二进制流来传输,你只要把他们一起写到一个输出流里面即可

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (1)链接 • 2012-10-02
  • 0 支持
    我知道的java读的方式有两种一种就是按照文本的形式,可以readline方法,一种就是按二进制流来读取,不能使用readline,但是我怎么判断文件内容结束呢,文件内容结束的时候有个一行boundary,用什么判断呢 – 柏拉图说 2012-10-02

二进制的数据是没有boundary的,传输的boundary是由你的协议规定的,例如,你规定第一个字节是长度,那你读的时候第一个字节就取做长度。所以你要这样做的话,首先自己得定义一个合适的协议。
http协议里消息头和消息体(body)是通过换行来区分的,先以文本的方式读取当读到换行符的时候,也就是消息头都读完了。消息头里的放的都是文本的key-value对,这个直接文本解析就好了。
接下来我按照你说的两种场景给你分析一下body的读取
1、formdata
其实formData也是以key-value的形式提交的,只不过在这里用的是而二进制的数据。直接读取,转成字符串即可
2、上传文件
文件包含两部分内容:文件名和内容
在post数据里,这两部分是分开存的,可以看看下图

Post示例数据

所以要读取文件,只需要分别读取这两部分内容即可。

kenvi
编辑于 2012-10-07
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (3)链接 • 2012-10-03
  • 0 支持
    是这样的,但是,body部分既有二进制的数据(也就是文件内容),还有boundary 还有别的参数,关键是怎么对这些数据进行分离 – 柏拉图说 2012-10-06
  • 0 支持
    我知道格式是这样的,但是不知道在读取内容的时候,用什么函数来读,因为body部分既有二进制数据又有文本数据,该使用什么函数读呢? – 柏拉图说 2012-10-07
  • 0 支持
    @柏拉图说 文本数据本身也是以二进制的方式存储的,直接二进制读取,文本部分进行一次转换就可以了。 – kenvi 2012-10-07

http://lv9.googlecode.com/svn/example/uploadkit/

这个是我实现的一个上传组件 现在还不是太完整 但是支持处理multipart/form-data类型的数据 由于multipart/form-data本身不对提交内容进行编码 所以Servlet中的request.getInputStream()方法返回的基本就是原始报文 我对这个报文做了个分析 完成了个简单的上传

但是 可能有BUG LZ有兴趣可以下来看看 有问题回复我

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-10-19
德问是一个专业的编程问答社区,请 登录注册 后再提交答案