关于使用multipart/form-data做文件上传的一点思考

最近几天在做文件上传的时候,使用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
回车
文件内容
--(随即生成数字或字母)--
回车

这不就行了,既然知道了流的格式,自己构造数组来存入流数据不就行了。

//我定义的数组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();
}
}


这样你可以在控制台上看到如上我说的那种格式数据,下面就可以自己解析了。附件代码是我项目中用到的上传类。
这是我第一次发博,以前只是看,“拿”,现在也贡献一下,呵呵。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值