In forum, a lot of people are looking for another way to upload file by jsp,other than SmartUpload,which is a free bean from jspsmart.com. 
Although its functionality is powerful, at least called "enough", the sourcecode is invisible to us,which is a little pity of this bean. 
A few days ago,I got an article talking about the upload things on onjava.com. 
and the author provided a piece of code to implement upload feature. 
Click  http://www.onjava.com/pub/a/onjava/2001/04/05/upload.html to enjoy it! 
However, there is also a flaw in his code, that's it only supports text plain file but binary format.In fact, most of files to upload are in binary format,aren't they? 
But don't worry, I have made some modification on the original sourcecode to enable it to support all file formats. 
Now I paste the whole source code below, 
hopefully it can be helpful to those who are interested in this problem. 
BTW: My Email is [email protected], welcome to send mail and discuss with me on any Java technical issues. 
Code: 
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; import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.InputStreamReader; 
public class FileUploadBean{   private String savePath, filepath, filename, contentType;   private Dictionary fields;   //Begin Rayman's modification   private static final int BUF_SIZE = 256;   //End Rayman's modification 
  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)     {       //System.out.println(fieldName);       //System.out.println("if loop");       return null;     }     //System.out.println(fieldName);     //System.out.println(fields.get("company"));     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 browsers include the full path on the client       // But Linux/Unix and Mac browsers only send the filename       // test if this is from a Windows browser       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[BUF_SIZE];     int i = in.readLine(line, 0, 128);     if (i < 3)       return;     int boundaryLength = i - 2; 
    String boundary = new String(line, 0, boundaryLength); //-2 discards the newline character     fields = new Hashtable(); 
    while (i != -1) {       String newLine = new String(line, 0, i);       if (newLine.startsWith("Content-Disposition: form-data; name=\"")) {         if (newLine.indexOf("filename=\"") != -1) {           setFilename(new String(line, 0, i-2));           if (filename==null)             return;           //this is the file content           i = in.readLine(line, 0, 128);           setContentType(new String(line, 0, i-2));           i = in.readLine(line, 0, 128);                      //Begin Rayman's modification             FileOutputStream pw = new FileOutputStream((savePath==null? "" : savePath) + filename);             boolean done = false;             int k = 0;             byte c1 = 0x0d;             byte c2 = 0x0a; 
            byte [] boundarybytes = boundary.getBytes();             byte [] magickey = new byte[boundarybytes.length + 2];             magickey[0] = c1;             magickey[1] = c2;             for(int t = 0;t<boundarybytes.length;t++)             {                 magickey[2+t] = boundarybytes[t];             }                          byte [] buf = new byte[magickey.length];             int count = 0;             byte c = -1;             boolean pause = false;           while (true) {             // the problem is the last line of the file content             // contains the new line character.             // So, we need to check if the current line is             // the last line             if(!pause)             {                 byte [] one = new byte[1];                 if(in.read(one)==-1) break;                 c = one[0];                 count ++;             }             else             {                 pause = false;             } 
            if(c==magickey[k])             {                 System.out.print((int)c + " " + (char)c + " ");                 if(k == magickey.length-1)                 {                     //It's last line.                     System.out.println("Last line!" + " count==" + count);                     break;                 }                 buf[k] = (byte)c;                 k++;             }             else             {                 if(k>0)                 { 
                    pw.write(buf,0,k); 
                }                 if(c==magickey[0])                 {                       pause = true;                 }                 else                 {                     pw.write(c);                 }                 k=0;             }           }           pw.close();           //End Rayman's modification 
        }         else {           //this is a field           // get the field name           int pos = newLine.indexOf("name=\"");           String fieldName = newLine.substring(pos+6, newLine.length()-3);           //System.out.println("fieldName:" + fieldName);           // blank line           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)) {             // The last line of the field             // contains the new line character.             // So, we need to check if the current line is             // the last line.             i = in.readLine(line, 0, 128);             if ((i==boundaryLength+2 ¦¦ i==boundaryLength+4) // + 4 is eof               && (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);           }           //System.out.println("fieldValue:" + fieldValue.toString());           fields.put(fieldName, fieldValue.toString());         }       }       i = in.readLine(line, 0, 128); 
    } // end while   } 
  public FileUploadBean()   {   } } 
   
 
  |