Note that there are some explanatory texts on larger screens.

plurals
  1. POhow to let Java HttpServer handle Post Request for File Upload
    primarykey
    data
    text
    <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>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload