//上传文件的javabean
package com.sh.jsp; import javax.servlet.http.HttpServletRequest; 
import javax.servlet.ServletInputStream; 
import java.util.Dictionary; 
import java.util.Hashtable; 
import java.io.PrintWriter; 
import java.io.BufferedWriter; 
import java.io.FileWriter; 
import java.io.IOException; 
public class Upload { 
private String savePath, filepath, filename, contentType; 
private Dictionary fields; public String getFilename() { 
return filename; //文件名
} public String getFilepath() { 
return filepath; //客户机上的文件路径
} public void setSavePath(String savePath) { 
this.savePath = savePath; //服务器上保存文件的路径
} public String getContentType() { 
return contentType; //
} public String getFieldValue(String fieldName) { //从哈希表中获取指名字段的值
if (fields == null || fieldName == null) 
return null; 
return (String) fields.get(fieldName); 
} private void setFilename(String s) { 
if (s==null) return; 
int pos = s.indexOf("filename=\""); 
if (pos != -1) { 
filepath = s.substring(pos+10, s.length()-1); 
// Windows浏览器发送完整的文件路径和名字 
// 但Linux/Unix和Mac浏览器只发送文件名字 
pos = filepath.lastIndexOf("\\"); //找寻最后一个反斜杠,从该位置到行末是文件名
if (pos != -1) filename = filepath.substring(pos + 1); 
else filename = filepath; 

} private void setContentType(String s) { 
if (s==null) 
return; 
int pos = s.indexOf(": "); //一个冒号加一个空格
if (pos != -1) 
contentType = s.substring(pos+2, s.length()); 
} public void doUpload(HttpServletRequest request) throws IOException { ServletInputStream in = request.getInputStream(); //读取套接字上收到的原始数据
byte[] line = new byte[128]; //存储并分析每行内容的字节数组
int i = in.readLine(line, 0, 128); //读第一行,应该读到分隔符,即一连串的"-----"和一个随机数字
                                   //以及最后一个换行符
if (i < 3) return; 
int boundaryLength = i - 2; //-1是为了丢弃换行字符,再-1是因为这是个基于0的数组
String boundary = new String(line, 0, boundaryLength); //-2丢弃换行字符 fields = new Hashtable(); //哈希表,用来存储各字段的值while (i != -1) //开始解析

 String newLine = new String(line, 0, i); // i 的值在上面第一次readline时返回,等于分界符的长度
 if (newLine.startsWith("Content-Disposition: form-data; name=\""))
  { 
   if (newLine.indexOf("filename=\"") != -1) //读到文件名域
    { 
      setFilename(new String(line, 0, i-2)); //调用setFilename方法,自动解析所含文件名
      if (filename==null) return; 
      //文件内容 
      i = in.readLine(line, 0, 128);         //紧接在后面的是ContentType属性
      setContentType(new String(line, 0, i-2)); //调用相应方法,自动解析ContentType属性值
      i = in.readLine(line, 0, 128);            //空行 
      i = in.readLine(line, 0, 128);            //从此行开始为文件数据,i返回该行的字符个数
      newLine = new String(line, 0, i); 
      PrintWriter pw = new PrintWriter(new 
        BufferedWriter(new FileWriter((savePath==null? "" : savePath) + filename))); 
                                                //构造文件输出流,其中filewriter是最基本的
                                                //文件输出流,bufferedwriter是缓冲直接磁盘
                                                //操作的中间流,而printwriter主要用来写字符
                                                //流,其特效方法是把要输出的字符流自动转换成
                                                //字节流
      while (i != -1 && !newLine.startsWith(boundary)) 
      { 
       // 文件内容的最后一行包含换行字符, 因此必须检查当前行是否是最后一行 
       i = in.readLine(line, 0, 128); 
       if ((i==boundaryLength+2 || i==boundaryLength+4) 
              && (new String(line, 0, i).startsWith(boundary))) 
       //boundaryLength的值是正常的分隔符(即带换行符)长度-2
       //所以通过检查该值是+2或是+4,即可检查出是文件域结束或是整个请求域结束两种情况.
       //考虑到这些,仅仅是为了避免多写入一个换行符
          pw.print(newLine.substring(0, newLine.length()-2)); //同样的道理,减掉换行符和
                                                              //基于0的下标带来的多1          
       else pw.print(newLine); 
       newLine = new String(line, 0, i); 
       } 
      pw.close(); 
     } 
    else //newLine.indexOf("filename=\"") != -1
     { 
      // 普通表单输入元素 
      // 获取输入元素名字 
      int pos = newLine.indexOf("name=\""); 
      String fieldName = newLine.substring(pos+6, newLine.length()-3); //减掉换行符
                                                                       //和 0下标
                                                                       //和 引号
      i = in.readLine(line, 0, 128); //空行
      i = in.readLine(line, 0, 128); //属性值
      newLine = new String(line, 0, i); 
      StringBuffer fieldValue = new StringBuffer(128); 
      while (i != -1 && !newLine.startsWith(boundary)) 
      { 
       // 最后一行包含换行字符 
       // 因此必须检查当前行是否是最后一行 
       i = in.readLine(line, 0, 128); 
       if ((i==boundaryLength+2 || i==boundaryLength+4) 
             && (new String(line, 0, i).startsWith(boundary))) 
       fieldValue.append(newLine.substring(0, newLine.length()-2)); 
       else fieldValue.append(newLine); 
       newLine = new String(line, 0, i); 
      } 
      fields.put(fieldName, fieldValue.toString()); 
     } //else newLine.indexOf("filename=\"") != -1
    } 
   i = in.readLine(line, 0, 128); 
   } 

}
兄弟,拿回去重新“javac”一下,应该就可以用了。
里面的注释已经多得有点过份了,应该能看懂吧?