Hi,
I am trying to create a HTTP file upload setup for a java application. So I have got a File Upload server which is working and a Client (I am not sure what changes I should do to make my Client code work with the server code) NEED HELP there. I am a java newbie so plz be kind.
Here is my Server Code
/*
* HTTPFileUploadServer.java
*/
// A File upload server which will handle files of any type and size
// (Text as well as binary files including images)
import java.io.*;
import java.net.*;
import java.util.*;
public class HTTPFileUploadServer extends Thread {
static final String HTML_START =
"<html>" +
"<title>HTTP POST Server in java</title>" +
"<body>";
static final String HTML_END =
"</body>" +
"</html>";
Socket connectedClient = null;
DataInputStream inFromClient = null;
DataOutputStream outToClient = null;
public HTTPFileUploadServer(Socket client) {
connectedClient = client;
}
void closeStreams() throws Exception {
inFromClient.close();
outToClient.close();
connectedClient.close();
}
// A routine to find the POST request end string from the
// Inputstream
int sub_array(byte [] array1, byte [] array2) throws Exception {
int i = array1.length - 1;
int j = array2.length - 1;
boolean found = false;
for (int k = i; k >=0; k--) {
if (array1[k] == array2[j]) {
found = true;
for (int l = j - 1; l >=0; l--) {
k = k - 1;
if (k < 0) return -1;
if (array1[k] == array2[l]) continue;
else {found = false; break;}
}
if (found == true) return k;
}
}
return -1;
}
// Read from InputStream
public String readLine() throws Exception {
String line = "";
char c = (char) inFromClient.read();
while (c != '\n'){
line = line + Character.toString(c);
c = (char) (inFromClient.read());
}
return line.substring(0,line.lastIndexOf('\r'));
}
//Thread for processing individual clients
public void run() {
String currentLine = null, postBoundary = null,
contentength = null, filename = null, contentLength = null;
FileOutputStream fout = null;
// Change these two parameters depending on the size of the file to be uploaded
// For a very large file > 200 MB, increase THREAD_SLEEP_TIME to prevent connection
// resets during upload, current settings are good tor handling upto 100 MB file size
long THREAD_SLEEP_TIME = 20;
int BUFFER_SIZE = 65535;
// Upload File size limit = 25MB, can be increased
long FILE_SIZE_LIMIT = 25000000;
try {
System.out.println( "The Client "+
connectedClient.getInetAddress() + ":" + connectedClient.getPort() + " is connected");
inFromClient = new DataInputStream(connectedClient.getInputStream());
outToClient = new DataOutputStream(connectedClient.getOutputStream());
connectedClient.setReceiveBufferSize(BUFFER_SIZE);
currentLine = 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")) { // GET Request
System.out.println("GET request");
if (httpQueryString.equals("/")) {
// The default home page
String responseString = HTTPFileUploadServer.HTML_START +
"<form action=\"http://127.0.0.1:5000\" enctype=\"multipart/form-data\"" +
"method=\"post\">" +
"Enter the name of the File <input name=\"file\" type=\"file\"><br>" +
"<input value=\"Upload\" type=\"submit\"></form>" +
"Upload only text files." +
HTTPFileUploadServer.HTML_END;
sendResponse(200, responseString , false);
} else {
sendResponse(404, "<b>The Requested resource not found ...." +
"Usage: http://127.0.0.1:5000</b>", false);
}
} //if
else { //POST Request
System.out.println("POST request");
while(true) {
currentLine = readLine();
if (currentLine.indexOf("Content-Type: multipart/form-data") != -1) {
postBoundary = currentLine.split("boundary=")[1];
// The POST boundary
while (true) {
currentLine = readLine();
if (currentLine.indexOf("Content-Length:") != -1) {
contentLength = currentLine.split(" ")[1];
System.out.println("Content Length = " + contentLength);
break;
}
}
//Content length should be <= 25MB
if (Long.valueOf(contentLength) > FILE_SIZE_LIMIT) {
inFromClient.skip(Long.valueOf(contentLength));
sendResponse(200, "File size should be less than 25MB", false);
break;
}
while (true) {
currentLine = readLine();
System.out.println(currentLine);
if (currentLine.indexOf("--" + postBoundary) != -1) {
filename = readLine().split("filename=")[1].replaceAll("\"", "");
String [] filelist = filename.split("\\" + System.getProperty("file.separator"));
filename = filelist[filelist.length - 1];
filename = filename.trim();
break;
}
}
if (filename.length() == 0) {
System.out.println("No input file selected.");
sendResponse(200, "Please select a valid file to upload..", false);
break;
}
String fileContentType = null;
try {
fileContentType = readLine().split(" ")[1];
} catch (Exception e) {
System.out.println("Can't determine POST request length");
}
System.out.println("File content type = " + fileContentType);
readLine(); //assert(readLine(inFromClient).equals("")) : "Expected line in POST request is "" ";
fout = new FileOutputStream(filename);
byte [] buffer = new byte[BUFFER_SIZE], endarray;
String end_flag = "--" + postBoundary + "--";
endarray = end_flag.getBytes();
int bytesRead, bytesAvailable;
while ((bytesAvailable = inFromClient.available()) > 0) {
Thread.sleep(THREAD_SLEEP_TIME);
//System.out.println("Available = " + inFromClient.available());
bytesRead = inFromClient.read(buffer, 0, BUFFER_SIZE);
int end_byte = 0;
//When number of bytes to be read in the stream < BUFFER_SIZE
if (bytesAvailable < BUFFER_SIZE) {
//System.out.println("End array length =" + endarray.length);
//System.out.println("Bytes read = " + bytesRead);
// Case where part of POST Boundary comes in the last buffer
if (bytesAvailable < endarray.length) {
byte [] extendedArray = new byte[BUFFER_SIZE + bytesAvailable];
System.arraycopy(buffer, 0, extendedArray, 0, bytesRead);
bytesRead = inFromClient.read(extendedArray, BUFFER_SIZE, bytesAvailable);
end_byte = sub_array(extendedArray, endarray);
if (end_byte == -1) fout.write(buffer, 0, bytesRead);
else fout.write(extendedArray, 0, end_byte - 2);
}
else {
// Case where POST Boundary is part of last buffer
end_byte = sub_array(buffer, endarray);
System.out.println("End byte = " + end_byte);
if (end_byte == -1) fout.write(buffer, 0, bytesRead);
else fout.write(buffer,0, end_byte - 2);
}
} else {
// Case where POST Boundary is part of the full buffer
if (bytesAvailable == 65535) end_byte = sub_array(buffer, endarray);
else end_byte = sub_array(buffer, endarray);
if (end_byte == -1) fout.write(buffer, 0, bytesRead);
else fout.write(buffer,0, end_byte - 2);
}
}//while
sendResponse(200, "File " + filename + " Uploaded..", false);
fout.close();
break;
} //if
}//while (true); //End of do-while
}//else
//Close all streams
System.out.println("Closing All Streams....");
closeStreams();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Done....");
}
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") && !fileName.endsWith(".html"))
contentTypeLine = "Content-Type: \r\n";
}
else {
responseString = HTTPFileUploadServer.HTML_START + responseString + HTTPFileUploadServer.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);
else outToClient.writeBytes(responseString);
}
//Send the requested file
public void sendFile(FileInputStream fin) throws Exception {
byte[] buffer = new byte[1024] ;
int bytesRead;
while ((bytesRead = fin.read(buffer)) != -1 ) {
outToClient.write(buffer, 0, bytesRead);
}
fin.close();
}
public static void main (String args[]) throws Exception {
ServerSocket Server = new ServerSocket (5000, 10, InetAddress.getByName("127.0.0.1 "));
System.out.println ("HTTP Server Waiting for client on port 5000");
//Create a new thread for processing clients
while(true) {
Socket connected = Server.accept();
(new HTTPFileUploadServer(connected)).start();
}
}
}
Here is my Client Code: I am not sure what changes should I make in this code to make it work for file upload alongwith the server code:-
import java.net.*;
import java.io.*;
public class MyClient
{
public static void main(String [] args)
{
String serverName = args[0];
int port = Integer.parseInt(args[1]);
try
{
System.out.println("Connecting to " + serverName
+ " on port " + port);
Socket client = new Socket(serverName, port);
System.out.println("Just connected to "
+ client.getRemoteSocketAddress());
OutputStream outToServer = client.getOutputStream();
DataOutputStream out =
new DataOutputStream(outToServer);
out.writeUTF("Hello from "
+ client.getLocalSocketAddress());
InputStream inFromServer = client.getInputStream();
DataInputStream in =
new DataInputStream(inFromServer);
System.out.println("Server says " + in.readUTF());
client.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
Thanks in advance