Java servlet无法接收大文件

时间:2017-08-11 17:14:58

标签: java spring maven servlets tomcat7

我用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);
    }

2 个答案:

答案 0 :(得分:1)

从消息中看来,连接由客户端或服务器或中间的某个代理关闭。

超时发生时,通常会关闭连接。

虽然通常我不希望在文件上传期间发生超时,但如果您的服务器出现内存问题并且GC正在努力工作,它仍然会发生。所以我建议在文件上传期间监控GC时间。如果高,则存在内存问题,不应将文件的全部内容存储在内存中。

答案 1 :(得分:1)

很可能与超时有关。有时,如果servlet加载请求的时间太长而服务器有限制,它将停止。这种情况发生在Google App引擎上,限制为60秒。解决它的方法是创建一个任务队列,以便处理不依赖于servlet。