最近几天在做文件上传的时候,使用enctype="multipart/form-data"时,在spring的controller里面没有像struts那样的Formfile之类封装好的类,可以直接拿到此类form里面的值。也许你会说用第三方jar来解决呀,是啊,像commons-fileupload.jar,SmartUpload我用过,确实好用啊,可是,这样就算完了?怎么实现的? 我不用它自己写不行吗?不就是个文件上传嘛!
在网上查了下,才知道浏览器Post的过来到controller的不像平时普通提交表单时用getParameter()方法就能拿到,而是一个流ServletInputStream。通过firebug可以清楚的看到post的数据格式:
--(随即生成数字或字母)
Content-Disposition: form-data; name="title"
(回车)
值
--(随即生成数字或字母)
Content-Disposition: form-data; name="1.txt"; filename="C:\1.txt"
Content-Type: text/plain
回车
文件内容
--(随即生成数字或字母)--
回车
这不就行了,既然知道了流的格式,自己构造数组来存入流数据不就行了。
这样你可以在控制台上看到如上我说的那种格式数据,下面就可以自己解析了。附件代码是我项目中用到的上传类。
这是我第一次发博,以前只是看,“拿”,现在也贡献一下,呵呵。
在网上查了下,才知道浏览器Post的过来到controller的不像平时普通提交表单时用getParameter()方法就能拿到,而是一个流ServletInputStream。通过firebug可以清楚的看到post的数据格式:
--(随即生成数字或字母)
Content-Disposition: form-data; name="title"
(回车)
值
--(随即生成数字或字母)
Content-Disposition: form-data; name="1.txt"; filename="C:\1.txt"
Content-Type: text/plain
回车
文件内容
--(随即生成数字或字母)--
回车
这不就行了,既然知道了流的格式,自己构造数组来存入流数据不就行了。
//我定义的数组m_binArray
this.m_totalBytes = this.m_request.getContentLength();
this.m_binArray = new byte[this.m_totalBytes];
ServletInputStream sis = this.m_request.getInputStream();
int i=0;
int j=0;
for (; i < this.m_totalBytes; i += j)
{
try {
/* 尝试将流写入数组:从数组的i索引开始,并读取一定长度的流,该长度可能会比计划长度小
* 返回实际读取的字节数。有人说用readline效率会高,我没试也不便评论
*/
j = sis.read(this.m_binArray, i, this.m_totalBytes-i);
System.out.println(new String(this.m_binArray,i,j));
}
catch (Exception exception)
{
e.printStackTrace();
}
}
这样你可以在控制台上看到如上我说的那种格式数据,下面就可以自己解析了。附件代码是我项目中用到的上传类。
这是我第一次发博,以前只是看,“拿”,现在也贡献一下,呵呵。