它不工作! multipart/form-data 请求的处理失败。在套接字上读取意外的 EOF

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

我知道之前有人问过这个问题,但其中 none 帮助了我。 我已经尝试了与此问题相关的所有解决方案,但没有得到解决方案。

如果有人知道这个错误会很有帮助

我的 ajax 代码是:

    $('#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');
        }
    });
});

我的 Servlet 代码是我使用 apache-commons 文件上传库编写文件上传代码的地方:

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();
    }
}

请帮助它变得复杂

实际上当我使用 AJAX 所以发生的事情是当我请求 servlet 处理上传的东西时它没有上传整个文件然后它立即返回响应所以 servlet 需要等待直到文件上传完成。

所以我只是在 ajax 调用中放置了一个 async : false 然后就成功了!