思路是把表单类型设置为enctype="multipart/form-data",其他表单中文本数据通过javascript处理,附加在action后面,后台通过request.getParameter()取得。上传文件调用commons-fileupload.jar中方法。
下面是部分代码。
<form  name="ajform" action="/da.do" method="post" enctype="multipart/form-data">
   <tr><td><input name="a" value=""></td></tr>
   <tr><td><input name="b" type="file"></td></tr>
   <tr><td><a href="#" onclick="checksubmit();">提交</a></td></tr>
</form>
<script language="javascript">
   function checksubmit(){
      var value  = "/da.do?formAction=save";   
      value = value+"&a="+ window.document.getElementById("a").value;
      window.document.ajform.action=value;
      window.document.ajform.submit();
   }
</script>
String a = request.getParameter("a");
try {
      //文件上传目录“/file/wj”
    String filepath= request.getSession().getServletContext().getRealPath("/")+"file"+File.separator+"wj";
   //文件上传临时目录“/file/temp”
    String tempPath = request.getSession().getServletContext().getRealPath("/")+"file"+File.separator+"temp";
    File dir = new File(filepath);
      //建立目录
       if(!dir.exists()){
        dir.mkdirs();
       }
       File dir1 = new File(tempPath);
       if(!dir1.exists()){
        dir1.mkdirs();
       }
       DiskFileUpload fu = new DiskFileUpload();
       //设置最大文件尺寸,这里是10MB
          fu.setSizeMax(10485760);
          //设置缓冲区大小,这里是4kb
          fu.setSizeThreshold(4096);
          //设置临时目录:
          fu.setRepositoryPath(tempPath);          
    List fileItems = fu.parseRequest(request);
    Iterator iter = fileItems.iterator();
    while (iter.hasNext()) {
       FileItem item = (FileItem) iter.next();
        String fileName = item.getName();
        //判断是否为文件
        if(fileName!=null){
         //取文件名
         String name = fileName.substring(fileName.lastIndexOf(File.separator)+1);
         if(fileName!=null&& !fileName.equals("")) {          
           File file = new File(filepath+File.separator+name);
                   //上传文件 
                  item.write(file);
                } 
        }  
     }
   } catch (Exception e) {
       e.printStackTrace();
   }