title: how to let Java HttpServer handle Post Request for File Upload
body: <p>First of all, my question is about HttpServer in Java to handle the POST request from a client, <strong>not</strong> about a Java client who can upload file to a web server.</p>
  
  <p>OK. I am using a lightweight HttpServer in Java to handle "GET" || "POST" requests. The source code of the HttpServer is copied from <a href="http://www.prasannatech.net/2008/11/http-web-server-java-post-file-upload.html" rel="nofollow">http://www.prasannatech.net/2008/11/http-web-server-java-post-file-upload.html</a>.</p>
  
  <pre><code>/*
   * HTTPPOSTServer.java
   * Author: S.Prasanna
   * @version 1.00 
   */
  
  import java.io.*;
  import java.net.*;
  import java.util.*;
  
  public class HTTPPOSTServer extends Thread {
  
      static final String HTML_START = 
          "&lt;html&gt;" +
          "&lt;title&gt;HTTP POST Server in java&lt;/title&gt;" +
          "&lt;body&gt;";
  
      static final String HTML_END = 
          "&lt;/body&gt;" +
          "&lt;/html&gt;";
  
      Socket connectedClient = null;    
      BufferedReader inFromClient = null;
      DataOutputStream outToClient = null;
  
  
      public HTTPPOSTServer(Socket client) {
          connectedClient = client;
      }            
  
      public void run() {
  
          String currentLine = null, postBoundary = null, contentength = null, filename = null, contentLength = null;
          PrintWriter fout = null;
  
          try {
  
              System.out.println( "The Client "+
                      connectedClient.getInetAddress() + ":" + connectedClient.getPort() + " is connected");
  
              inFromClient = new BufferedReader(new InputStreamReader (connectedClient.getInputStream()));                  
              outToClient = new DataOutputStream(connectedClient.getOutputStream());
  
              currentLine = inFromClient.readLine();
              String headerLine = currentLine;                
              StringTokenizer tokenizer = new StringTokenizer(headerLine);
              String httpMethod = tokenizer.nextToken();
              String httpQueryString = tokenizer.nextToken();
  
              System.out.println(currentLine);
  
              if (httpMethod.equals("GET")) {    
                  System.out.println("GET request");        
                  if (httpQueryString.equals("/")) {
                      // The default home page
                      String responseString = HTTPPOSTServer.HTML_START + 
                          "&lt;form action=\"http://127.0.0.1:5000\" enctype=\"multipart/form-data\"" +
                          "method=\"post\"&gt;" +
                          "Enter the name of the File &lt;input name=\"file\" type=\"file\"&gt;&lt;br&gt;" +
                          "&lt;input value=\"Upload\" type=\"submit\"&gt;&lt;/form&gt;" +
                          "Upload only text files." +
                          HTTPPOSTServer.HTML_END;
                      sendResponse(200, responseString , false);                                
                  } else {
                      sendResponse(404, "&lt;b&gt;The Requested resource not found ...." +
                              "Usage: http://127.0.0.1:5000&lt;/b&gt;", false);                  
                  }
              }
              else { //POST request
                  System.out.println("POST request"); 
                  do {
                      currentLine = inFromClient.readLine();
  
                      if (currentLine.indexOf("Content-Type: multipart/form-data") != -1) {
                          String boundary = currentLine.split("boundary=")[1];
                          // The POST boundary                           
  
                          while (true) {
                              currentLine = inFromClient.readLine();
                              if (currentLine.indexOf("Content-Length:") != -1) {
                                  contentLength = currentLine.split(" ")[1];
                                  System.out.println("Content Length = " + contentLength);
                                  break;
                              }                      
                          }
  
                          //Content length should be &lt; 2MB
                          if (Long.valueOf(contentLength) &gt; 2000000L) {
                              sendResponse(200, "File size should be &lt; 2MB", false);
                          }
  
                          while (true) {
                              currentLine = inFromClient.readLine();
                              if (currentLine.indexOf("--" + boundary) != -1) {
                                  filename = inFromClient.readLine().split("filename=")[1].replaceAll("\"", "");                                        
                                  String [] filelist = filename.split("\\" + System.getProperty("file.separator"));
                                  filename = filelist[filelist.length - 1];                          
                                  System.out.println("File to be uploaded = " + filename);
                                  break;
                              }                      
                          }
  
                          String fileContentType = inFromClient.readLine().split(" ")[1];
                          System.out.println("File content type = " + fileContentType);
  
                          inFromClient.readLine(); //assert(inFromClient.readLine().equals("")) : "Expected line in POST request is "" ";
  
                          fout = new PrintWriter(filename);
                          String prevLine = inFromClient.readLine();
                          currentLine = inFromClient.readLine();              
  
                          //Here we upload the actual file contents
                          while (true) {
                              if (currentLine.equals("--" + boundary + "--")) {
                                  fout.print(prevLine);
                                  break;
                              }
                              else {
                                  fout.println(prevLine);
                              }    
                              prevLine = currentLine;                      
                              currentLine = inFromClient.readLine();
                          }
  
                          sendResponse(200, "File " + filename + " Uploaded..", false);
                          fout.close();                   
                      } //if                                              
                  }while (inFromClient.ready()); //End of do-while
              }//else
          } catch (Exception e) {
              e.printStackTrace();
          }    
      }
  
      public void sendResponse (int statusCode, String responseString, boolean isFile) throws Exception {
  
          String statusLine = null;
          String serverdetails = "Server: Java HTTPServer";
          String contentLengthLine = null;
          String fileName = null;        
          String contentTypeLine = "Content-Type: text/html" + "\r\n";
          FileInputStream fin = null;
  
          if (statusCode == 200)
              statusLine = "HTTP/1.1 200 OK" + "\r\n";
          else
              statusLine = "HTTP/1.1 404 Not Found" + "\r\n";    
  
          if (isFile) {
              fileName = responseString;            
              fin = new FileInputStream(fileName);
              contentLengthLine = "Content-Length: " + Integer.toString(fin.available()) + "\r\n";
              if (!fileName.endsWith(".htm") &amp;&amp; !fileName.endsWith(".html"))
                  contentTypeLine = "Content-Type: \r\n";    
          }                        
          else {
              responseString = HTTPPOSTServer.HTML_START + responseString + HTTPPOSTServer.HTML_END;
              contentLengthLine = "Content-Length: " + responseString.length() + "\r\n";    
          }            
  
          outToClient.writeBytes(statusLine);
          outToClient.writeBytes(serverdetails);
          outToClient.writeBytes(contentTypeLine);
          outToClient.writeBytes(contentLengthLine);
          outToClient.writeBytes("Connection: close\r\n");
          outToClient.writeBytes("\r\n");        
  
          if (isFile) sendFile(fin, outToClient);
          else outToClient.writeBytes(responseString);
  
          outToClient.close();
      }
  
      public void sendFile (FileInputStream fin, DataOutputStream out) throws Exception {
          byte[] buffer = new byte[1024] ;
          int bytesRead;
  
          while ((bytesRead = fin.read(buffer)) != -1 ) {
              out.write(buffer, 0, bytesRead);
          }
          fin.close();
      }
  
      public static void main (String args[]) throws Exception {
  
          ServerSocket Server = new ServerSocket (5000);         
          System.out.println ("HTTP Server Waiting for client on port 5000");
  
          while(true) {                                         
              Socket connected = Server.accept();
              (new HTTPPOSTServer(connected)).start();
          }      
      }
  }
  </code></pre>
  
  <p>I read through the code, I think the code should be all right. </p>
  
  <p>But when I try to upload a file, it will print out POST request, and then hang there and never receive any bytes.</p>
  
  <p>If you are willing to, you can run the above source code directly. After launch it, you can type 127.0.0.1:5000 in a browser, and it will show a file upload, then if I try upload a file, it will hang there after printing PoST request.</p>
  
  <p>If you are bored to read the code, may I ask the following simpler question?</p>
  
  <p>So, what exactly Chrome or any other web browser do about form -> input type='file'?</p>
  
  <p>If I am using a ServerSocket to handle the HTTP request, I just get the InputStream of the request, and then all the content (including HTTP headers &amp; the uploading file's content) will go through that InputStream, right?</p>
  
  <p>The above code can analyse the headers, but then it seems nothing is sent from the browser any more.</p>
  
  <p>Can anyone pls help?</p>
  
  <p>Thanks</p>