关于使用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();
      }
    }

   
    这样你可以在控制台上看到如上我说的那种格式数据,下面就可以自己解析了。附件代码是我项目中用到的上传类。
    这是我第一次发博,以前只是看,“拿”,现在也贡献一下,呵呵。

你可能感兴趣的:(spring,struts,浏览器,Firebug,J#)