javafile-uploadapache-commons-fileupload

Its not working!! Processing of multipart/form-data request failed. Unexpected EOF read on the socket


I know this question has been asked previously but none of them helped me. I've tried every solution related to this question but didn't got the solution.

If anyone knows about this error It will be very helpful

My ajax code is :

    $('#versionForm').submit(function (e) {

    formData = new FormData(this);
    $.each(formAttachements, function (i, file) {
        formData.append('file-' + i, file);
        console.log('data' + formData);
    });

    $.ajax({

        url: 'UploadServlet',
        data: formData,
        type: 'POST',
        cache: false,
        contentType: false,
        processData: false,
        success: function () {
            console.log('Files Uploaded');
            console.log('versionForm submit ajax success');
        },
        error: function () {

            console.log('versionForm submit ajax error');
        }
    });
});

My Servlet code is where I wrote the code for fileUpload using apache-commons file-upload library:

public class UploadServlet extends HttpServlet {

String version = "";
String countryCode = "";

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    System.out.println("In Upload Servlet");

    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    System.out.println("Is form multipart:" + isMultipart);

    // check if form is multipart
    if (isMultipart) {
        // Create a factory for disk-based file items
        DiskFileItemFactory factory = new DiskFileItemFactory();

        // Configure a repository (to ensure a secure temp location is used)
        ServletContext context = this.getServletConfig().getServletContext();
        File repository = (File) context.getAttribute("javax.servlet.context.tempdir");
        factory.setRepository(repository);

        // Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload(factory);


        try {

            List<FileItem> items;

            // Parse the request
            items = upload.parseRequest(request);

            for(FileItem item : items) {
                // Process a regular form field
                if (item.isFormField()) {
                    System.out.println("Regular form field!");
                    processFormField(item);

                    // Process a file upload
                } else {
                    System.out.println("File Upload Field!");
                     InputStream fileContent = item.getInputStream();
                    processUploadFile(fileContent,item);
                }
            }




        } catch (FileUploadException ex) {
            Logger.getLogger(UploadServlet.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

// for regular form field
public void processFormField(FileItem item) {
    String fieldName = item.getFieldName();
    String value = item.getString();

    if (fieldName.equals("version")) {
        version = value;
    }
    if (fieldName.equals("countryCode")) {
        countryCode = value;
    }
    System.out.println("fieldName " + fieldName);
    System.out.println("value " + value);
}

// for upload file
public void processUploadFile(InputStream fileContent,FileItem item) {

    // fields of uploaded file
    String fieldName = item.getFieldName();
    String fileName = item.getName();
    String contentType = item.getContentType();
    boolean isInMemory = item.isInMemory();
    long sizeInBytes = item.getSize();
    System.out.println("FieldName:" + fieldName + ",FileName:" + fileName + ",ContentType:" + contentType
            + ",IsInmemory:" + isInMemory + ",SizeInByte:" + sizeInBytes);


    String saveDirPath = "C:\\Users\\Gest1\\Desktop\\karan\\server\\" + countryCode + "\\" + version;
    File file = new File(saveDirPath);
    // if directory does not exists make directory
    if (!file.exists()) {
        file.mkdirs();
        System.out.println("Dir created!");
    }

    // Path for file
    String filePath = saveDirPath + File.separator + fileName;

    try {

        while (fileContent.available() > 0) {
            System.out.println("Inside While Loop");
            // write the file
            File storeFile = new File(filePath);
            item.write(storeFile);
            fileContent.close();

        }

    } catch (EOFException ex) {
        Logger.getLogger(UploadServlet.class.getName()).log(Level.SEVERE, null, ex);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Please help its getting complex


Solution

  • Actually as I was using AJAX so what is happening is when I request servlet to process the upload thing it wasn't uploading whole file and then It is giving response back Immediately So the servlet needs to wait untill the file Upload finishes.

    So I just put a async : false In ajax call and then It just worked!