它不工作! 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 然后就成功了!
我知道之前有人问过这个问题,但其中 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 然后就成功了!