Java servlet 无法接收大文件
Java servlet not able to recieve large files
我用 Maven 和 Spring 构建了一个 Java servlet 服务器,我正在从 android 设备向服务器发送大文件。我已成功发送大小为 6MB 到 41MB 的文件,但是当我尝试发送大小为 100MB 或更大的文件时,我在服务器上收到以下错误:
org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
发生这种情况是因为服务器无法处理这种大小的请求吗?是否可以增加允许文件的大小?怎么样?
这是我的服务器代码:
try {
List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);//Error happens here
List<File> files = new ArrayList<File>();//Holds all the files that were received
HashMap<String, String> map = new HashMap<String, String>();
for (FileItem item : items) {
if (item.isFormField()) {
// Process regular form field (input type="text|radio|checkbox|etc", select, etc).
String fieldName = item.getFieldName();
String fieldValue = item.getString();
map.put(fieldName, fieldValue);
} else {
// Process form file field (input type="file").
String fileName = FilenameUtils.getName(item.getName());//If the name was not specified set default
String filePath = Constants.ORIGINAL_DIRECTORY_PATH + new SecureRandom().nextInt() + "_" +fileName;
File storeFile = new File(filePath);
item.write(storeFile);
files.add(storeFile);
}
}
} catch (FileUploadException e) {
throw new ServletException("Cannot parse multipart request.", e);
}
从消息来看,连接似乎被客户端或服务器或中间的某个代理关闭。
连接通常在发生超时时关闭。
虽然通常我不希望在文件上传期间发生超时,但如果您的服务器出现内存问题并且 GC 正在努力工作,它仍然会发生。所以我建议在文件上传期间监控 GC 时间。如果很高,说明内存有问题,不应将文件的全部内容存储在内存中。
很可能与超时有关。有时,如果 servlet 加载请求的时间过长并且服务器有限制,它将停止。这发生在限制为 60 秒的 Google App 引擎上。解决它的方法是创建一个任务队列,以便处理不依赖于 servlet。
我用 Maven 和 Spring 构建了一个 Java servlet 服务器,我正在从 android 设备向服务器发送大文件。我已成功发送大小为 6MB 到 41MB 的文件,但是当我尝试发送大小为 100MB 或更大的文件时,我在服务器上收到以下错误:
org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
发生这种情况是因为服务器无法处理这种大小的请求吗?是否可以增加允许文件的大小?怎么样?
这是我的服务器代码:
try {
List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);//Error happens here
List<File> files = new ArrayList<File>();//Holds all the files that were received
HashMap<String, String> map = new HashMap<String, String>();
for (FileItem item : items) {
if (item.isFormField()) {
// Process regular form field (input type="text|radio|checkbox|etc", select, etc).
String fieldName = item.getFieldName();
String fieldValue = item.getString();
map.put(fieldName, fieldValue);
} else {
// Process form file field (input type="file").
String fileName = FilenameUtils.getName(item.getName());//If the name was not specified set default
String filePath = Constants.ORIGINAL_DIRECTORY_PATH + new SecureRandom().nextInt() + "_" +fileName;
File storeFile = new File(filePath);
item.write(storeFile);
files.add(storeFile);
}
}
} catch (FileUploadException e) {
throw new ServletException("Cannot parse multipart request.", e);
}
从消息来看,连接似乎被客户端或服务器或中间的某个代理关闭。
连接通常在发生超时时关闭。
虽然通常我不希望在文件上传期间发生超时,但如果您的服务器出现内存问题并且 GC 正在努力工作,它仍然会发生。所以我建议在文件上传期间监控 GC 时间。如果很高,说明内存有问题,不应将文件的全部内容存储在内存中。
很可能与超时有关。有时,如果 servlet 加载请求的时间过长并且服务器有限制,它将停止。这发生在限制为 60 秒的 Google App 引擎上。解决它的方法是创建一个任务队列,以便处理不依赖于 servlet。