Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- UploadServer program - simple file upload web-server
- Author: Denis Volkov (c) 2007
- For information and support visit http://www.denvo.ru
- This program is FREEWARE, you are free to use any part of code
- as well as whole program in your development provided that you
- remain original copyrights and site name in your source.
- The product is distributed "as is". The author of the Product will
- not be liable for any consequences, loss of profit or any other kind
- of loss, that may occur while using the product itself and/or together
- with any other software.
- */
- import java.net.*;
- import java.io.*;
- import java.security.*;
- import java.util.*;
- import java.util.regex.*;
- import java.nio.charset.*;
- public class UploadServer extends Thread
- {
- private final static String httpHeader = "HTTP/1.1 200 OK\r\n"
- + "Content-Type: text/html\r\n"
- + "\r\n";
- private final static String uploadFormString = httpHeader
- + "<form method=\"POST\" enctype=\"multipart/form-data\">\r\n"
- + "<input type=\"file\" name=\"upload_file\" size=100>\r\n"
- + "<input type=\"submit\" value=\"Upload\">\r\n"
- + "</form>\r\n\r\n";
- private final Charset streamCharset = Charset.forName("ISO-8859-1");
- private ServerSocket serverSocket;
- private Socket clientSocket;
- UploadServer(int port) throws Exception
- {
- serverSocket = new ServerSocket(port);
- System.err.println("Server ready @" + port);
- }
- public void run()
- {
- while(true)
- {
- try
- {
- clientSocket = serverSocket.accept();
- System.err.println("Client connection accepted from "
- + clientSocket.getInetAddress().toString());
- // Read and process data from socket
- processConnection();
- }
- catch(Exception e)
- {
- System.err.println("Exception in run's main loop");
- e.printStackTrace();
- }
- // Close socket
- try
- {
- clientSocket.close();
- }
- catch(Exception e) { }
- System.err.println("Client connection closed");
- }
- }
- private void processConnection() throws Exception
- {
- InputStream inStream = clientSocket.getInputStream();
- BufferedReader in = new BufferedReader(new InputStreamReader(inStream, streamCharset));
- OutputStream out = clientSocket.getOutputStream();
- // Read requiest header
- String headerLine, firstLine = null;
- Map headerData = new TreeMap();
- Pattern headerPattern = Pattern.compile("([^\\:]+)\\:(.*)");
- while((headerLine = in.readLine()).length() > 0)
- {
- if(firstLine == null)
- firstLine = headerLine;
- else
- {
- Matcher m = headerPattern.matcher(headerLine);
- if(m.matches())
- {
- headerData.put(m.group(1).trim(), m.group(2).trim());
- }
- }
- System.out.println("HEADER: " + headerLine);
- }
- // Process first line of request
- if(firstLine.startsWith("GET"))
- {
- System.out.println("Send upload form");
- // Show upload form
- out.write(uploadFormString.getBytes());
- }
- else if(firstLine.startsWith("POST"))
- {
- // Get body info
- int contentLength = Integer.parseInt((String)(headerData.get("Content-Length")));
- String contentType = (String)(headerData.get("Content-Type"));
- String boundary = "\r\n--" + contentType.substring(contentType.indexOf("boundary=") + 9) + "--";
- System.out.println("File upload, reading body: " + contentLength + " bytes");
- // Prepare to reading
- Pattern fileNamePattern = Pattern.compile("filename=\"([^\"]+)\"");
- OutputStreamWriter writer = null;
- MessageDigest digestMD5 = MessageDigest.getInstance("MD5");
- String fileName = null;
- String prevBuffer = "";
- char[] buffer = new char[16 << 10];
- int totalLength = contentLength;
- // Reading loop
- while(contentLength > 0)
- {
- if(writer == null)
- {
- // Read strings
- String bodyLine = in.readLine();
- contentLength -= bodyLine.length() + 2;
- // Find name of file
- if(bodyLine.length() > 0)
- {
- Matcher m = fileNamePattern.matcher(bodyLine);
- if(m.find())
- {
- fileName = m.group(1);
- }
- }
- else if(fileName != null)
- {
- OutputStream stream = new FileOutputStream(fileName);
- if(digestMD5 != null)
- stream = new DigestOutputStream(stream, digestMD5);
- writer = new OutputStreamWriter(stream, streamCharset);
- }
- else
- throw new RuntimeException("Name of uploaded file not found");
- }
- else
- {
- // Read data from stream
- int readLength = Math.min(contentLength, buffer.length);
- readLength = in.read(buffer, 0, readLength);
- if(readLength < 0)
- break;
- contentLength -= readLength;
- // Find boundary string
- String curBuffer = new String(buffer, 0, readLength);
- String bothBuffers = prevBuffer + curBuffer;
- int boundaryPos = bothBuffers.indexOf(boundary);
- if(boundaryPos == -1)
- {
- writer.write(prevBuffer, 0, prevBuffer.length());
- prevBuffer = curBuffer;
- }
- else
- {
- writer.write(bothBuffers, 0, boundaryPos);
- break;
- }
- }
- // Write stats
- System.out.print("Read: " + (totalLength - contentLength)
- + " Remains: " + contentLength + " Total: " + totalLength
- + " bytes \r");
- }
- System.out.println("Done ");
- writer.close();
- // Finalize digest calculation
- byte[] md5Sum = digestMD5.digest();
- StringBuffer md5SumString = new StringBuffer();
- for(int n = 0; n < md5Sum.length; ++ n)
- md5SumString.append(printByte(md5Sum[n]));
- // Output client info
- String answer = httpHeader + "<p><b>Upload completed, " + totalLength
- + " bytes, MD5 sum: " + md5SumString.toString() + "</b>"
- + "<p><a href=\"/\">Next file</a>\r\n\r\n";
- out.write(answer.getBytes());
- }
- }
- private static String printByte(byte b)
- {
- int bi = ((int)b) & 0xFF;
- if(bi < 16)
- return "0" + Integer.toHexString(bi);
- else
- return Integer.toHexString(bi);
- }
- public static void main(String[] args)
- {
- try
- {
- if(args.length < 1)
- {
- System.out.println("Usage: UploadServer <port>");
- return;
- }
- UploadServer server = new UploadServer(Integer.parseInt(args[0]));
- server.start();
- }
- catch(Exception e)
- {
- System.err.println("Error in main");
- e.printStackTrace();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement