Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java servlet无法接收大文件_Java_Spring_Maven_Servlets_Tomcat7 - Fatal编程技术网

Java servlet无法接收大文件

Java servlet无法接收大文件,java,spring,maven,servlets,tomcat7,Java,Spring,Maven,Servlets,Tomcat7,我用Maven和Spring构建了一个JavaServlet服务器,我正在从android设备向服务器发送大文件。我已成功发送大小为6MB到41MB的文件,但当我尝试发送大小为100MB或更大的文件时,服务器上出现以下错误: org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly 发生这种情况是因为服务器无法处理这种大小的请求吗?是否可以增加允许文件的大

我用Maven和Spring构建了一个JavaServlet服务器,我正在从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);
    }
试试看{
List items=new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);//此处发生错误
List files=new ArrayList();//保存收到的所有文件
HashMap=newHashMap();
用于(文件项:项){
if(item.isFormField()){
//处理常规表单字段(输入type=“text | radio | checkbox | etc”,选择等)。
字符串fieldName=item.getFieldName();
String fieldValue=item.getString();
map.put(字段名、字段值);
}否则{
//处理表单文件字段(输入类型=“文件”)。
String fileName=FilenameUtils.getName(item.getName());//如果未指定名称,则设置默认值
字符串filePath=Constants.ORIGINAL\u DIRECTORY\u PATH+new SecureRandom().nextInt()+“\u”+文件名;
文件存储文件=新文件(文件路径);
item.write(存储文件);
添加(存储文件);
}
}
}捕获(文件上载异常){
抛出新的ServletException(“无法解析多部分请求。”,e);
}

从消息看来,连接是由客户端或服务器或中间的一些代理关闭的。 连接通常在超时时关闭


虽然我通常不希望在文件上传过程中出现超时,但在服务器内存出现问题且GC工作正常的情况下仍然会出现超时。因此,我建议在文件上载期间监视GC时间。如果值高,则表示内存有问题,不应将文件的全部内容存储在内存中。

很可能与超时有关。有时,如果servlet加载请求的时间过长,并且服务器有限制,它将停止。这发生在谷歌应用程序引擎上,限制为60秒。解决方法是创建一个任务队列,以便处理不依赖于servlet。

如果可能,您不应该将要提供服务的文件的全部内容存储在内存中。相反,获取数据的InputStream,并将数据逐段复制到Servlet OutputStream。您有这样的示例吗?您可以添加完整的异常stacktrace吗?您尝试过吗?