0

I am very new to java and servlet programming. I am not sure whether it is possible to write a servlet which when passed a URL from the local client machine, uploads the file to the server.

basically on the client machine we have a C# program and on the server side we have Apache-tomcat installed. I need to upload file(s) to the server using C# program on client machine.

Should I provide any more information (?)

Thanks in Advance

Abhishek
  • 3,337
  • 4
  • 32
  • 51
  • You need to upload the file instead of url.. Google it you will get thousands of sample codes to upload file using servlets – Anoop LL Dec 28 '15 at 10:40
  • I have to agree, you should send the file instead of a URI to the file, and you do that by initiating an http file upload request. – QuakeCore Dec 28 '15 at 10:49
  • I could not get one, Can you point me to any such link. Please consider I am beginner to all this. @AnoopLL Regards, – Abhishek Dec 28 '15 at 11:00
  • @QuakeCore: how do I do that, Any example to begin with ? regards – Abhishek Dec 28 '15 at 11:02
  • http://www.codejava.net/java-ee/servlet/java-file-upload-example-with-servlet-30-api – Anoop LL Dec 28 '15 at 11:04
  • http://www.avajava.com/tutorials/lessons/how-do-i-upload-a-file-to-a-servlet.html – Anoop LL Dec 28 '15 at 11:04
  • @AnoopLL: Either I am not getting you or you have not read the question completely. I dun want to use a webpage. All your examples uses HTML "Form" to do the post/ upload. I dun want to use it – Abhishek Dec 28 '15 at 11:07

1 Answers1

1

Note this code illustrates the general idea and not guaranteed to work without modification. The C# file upload part

// this code shows you how the browsers wrap the file upload request, you still can fine a way simpler code to do the same thing.
   public void PostMultipleFiles(string url, string[] files)
{
    string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
    httpWebRequest.ContentType = "multipart/form-data; boundary=" + boundary;
    httpWebRequest.Method = "POST";
    httpWebRequest.KeepAlive = true;
    httpWebRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;
    Stream memStream = new System.IO.MemoryStream();
    byte[] boundarybytes =System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary     +"\r\n");
    string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition:  form-data; name=\"{0}\";\r\n\r\n{1}";
    string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n Content-Type: application/octet-stream\r\n\r\n";
    memStream.Write(boundarybytes, 0, boundarybytes.Length);
    for (int i = 0; i < files.Length; i++)
    {
        string header = string.Format(headerTemplate, "file" + i, files[i]);
        //string header = string.Format(headerTemplate, "uplTheFile", files[i]);
        byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
        memStream.Write(headerbytes, 0, headerbytes.Length);
        FileStream fileStream = new FileStream(files[i], FileMode.Open,
        FileAccess.Read);
        byte[] buffer = new byte[1024];
        int bytesRead = 0;
        while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
        {
            memStream.Write(buffer, 0, bytesRead);
        }
        memStream.Write(boundarybytes, 0, boundarybytes.Length);
        fileStream.Close();
    }
    httpWebRequest.ContentLength = memStream.Length;
    Stream requestStream = httpWebRequest.GetRequestStream();
    memStream.Position = 0;
    byte[] tempBuffer = new byte[memStream.Length];
    memStream.Read(tempBuffer, 0, tempBuffer.Length);
    memStream.Close();
    requestStream.Write(tempBuffer, 0, tempBuffer.Length);
    requestStream.Close();
    try
    {
        WebResponse webResponse = httpWebRequest.GetResponse();
        Stream stream = webResponse.GetResponseStream();
        StreamReader reader = new StreamReader(stream);
        string var = reader.ReadToEnd();

    }
    catch (Exception ex)
    {
        response.InnerHtml = ex.Message;
    }
    httpWebRequest = null;
}

and to understand how the above code was written you might wanna take a look at How does HTTP file upload work?

POST /upload?upload_progress_id=12344 HTTP/1.1
Host: localhost:3000
Content-Length: 1325
Origin: http://localhost:3000
... other headers ...
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryePkpFF7tjBAqx29L

------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="MAX_FILE_SIZE"

100000
------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="uploadedfile"; filename="hello.o"
Content-Type: application/x-object

... contents of file goes here ...
------WebKitFormBoundaryePkpFF7tjBAqx29L--

and finally all you have to do is to implement a servlet that can handle the file upload request, then you do whatever that you want to do with the file, take a look at this file upload tutorial

protected void processRequest(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");

    // Create path components to save the file
    final String path = request.getParameter("destination");
    final Part filePart = request.getPart("file");
    final String fileName = getFileName(filePart);

    OutputStream out = null;
    InputStream filecontent = null;
    final PrintWriter writer = response.getWriter();

    try {
        out = new FileOutputStream(new File(path + File.separator
                + fileName));
        filecontent = filePart.getInputStream();

        int read = 0;
        final byte[] bytes = new byte[1024];

        while ((read = filecontent.read(bytes)) != -1) {
            out.write(bytes, 0, read);
        }
        writer.println("New file " + fileName + " created at " + path);
        LOGGER.log(Level.INFO, "File{0}being uploaded to {1}", 
                new Object[]{fileName, path});
    } catch (FileNotFoundException fne) {
        writer.println("You either did not specify a file to upload or are "
                + "trying to upload a file to a protected or nonexistent "
                + "location.");
        writer.println("<br/> ERROR: " + fne.getMessage());

        LOGGER.log(Level.SEVERE, "Problems during file upload. Error: {0}", 
                new Object[]{fne.getMessage()});
    } finally {
        if (out != null) {
            out.close();
        }
        if (filecontent != null) {
            filecontent.close();
        }
        if (writer != null) {
            writer.close();
        }
    }
}

private String getFileName(final Part part) {
    final String partHeader = part.getHeader("content-disposition");
    LOGGER.log(Level.INFO, "Part Header = {0}", partHeader);
    for (String content : part.getHeader("content-disposition").split(";")) {
        if (content.trim().startsWith("filename")) {
            return content.substring(
                    content.indexOf('=') + 1).trim().replace("\"", "");
        }
    }
    return null;
}
Community
  • 1
  • 1
QuakeCore
  • 1,886
  • 2
  • 15
  • 33
  • Hey @QuakeCore thank you so much for this usefull suggestion. Now I have one web page upload.jsp and another servlet UploadServlet.jsp. Using your servlet code I can upload my files using the web browser (upload.jsp). But when use "PostMultipleFiles" function from C# I get error 500 and the file is not able to upload for the parameters of the function "PostMultipleFiles" url = @"http://localhost:8080/t7s3upload/UploadServlet" (this is servlet URL) files = { @"C:\Users\ad12183\Desktop\thesisTalk.png" }; (this is the file I am uploading) Am I missing something? Regards, – Abhishek Jan 04 '16 at 11:55