Jetty抛出异常:'超出缓冲区大小:没有行终止符'使用getParts时

时间:2015-12-21 20:40:29

标签: java angularjs file-upload jetty embedded-jetty

我正在尝试上传文件。在servlet中,当我根据请求调用getParts()时,我收到以下错误:

java.io.IOException: Buffer size exceeded: no line terminator
    at org.eclipse.jetty.util.ReadLineInputStream.readLine(ReadLineInputStream.java:55)
    at org.eclipse.jetty.util.MultiPartInputStreamParser.parse(MultiPartInputStreamParser.java:487)
    at org.eclipse.jetty.util.MultiPartInputStreamParser.getParts(MultiPartInputStreamParser.java:405)
    at org.eclipse.jetty.server.Request.getParts(Request.java:2311)
    at org.eclipse.jetty.server.Request.getParts(Request.java:2290)

知道如何解决此错误吗?我研究了很多并且还实施了很多解决方案,但没有任何工作。

带有以下注释的带注释的servlet:

@MultipartConfig

启动Jetty时,将以下配置添加到服务器:(似乎版本9.3.6.v20151106中没有TagLibConfiguration)

WebAppContext root = new WebAppContext();
    root.setConfigurations(new Configuration[] {
            new AnnotationConfiguration(), new WebXmlConfiguration(),
            new WebInfConfiguration(), //new TagLibConfiguration(),
            new PlusConfiguration(), new MetaInfConfiguration(),
            new JettyWebXmlConfiguration(),
            new FragmentConfiguration(), new EnvConfiguration() });
            ....
            ....

            ServletHolder clientServletHolder = new ServletHolder(new ClientServlet(lwServer, lwServer.getSecureAddress()
                            .getPort()));
            clientServletHolder.getRegistration().setMultipartConfig(new MultipartConfigElement(System.getProperty("java.io.tmpdir")));
            ....
            ....

我上传的文件是二进制文件。

如果我在下面尝试

            String content = IOUtils.toString(req.getInputStream(), parameters.get("charset"));
            byte[] byteArray = content.getBytes();
            System.out.println("content len : " + content.length() + "   byteArray size : " + byteArray.length);

            The output is 

            content len : 46934   byteArray size : 52864

当我进行文件比较时,内容不匹配。

下面的内容也不匹配。我相信的字符集是UTF-8'。

File saveFile = new File("C:\\test\\downloadedFile.bin");
            // opens input stream of the request for reading data
            InputStream inputStream = req.getInputStream();

            // opens an output stream for writing file
            FileOutputStream outputStream = new FileOutputStream(saveFile);

            byte[] buffer = new byte[100000];
            int bytesRead = -1;
            System.out.println("Receiving data...");

            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }

            System.out.println("Data received.");
            outputStream.close();
            inputStream.close();

AngularJS代码如下:

$('#uploadFileSubmit').click(function(e) {
                    e.preventDefault();
                    var value = $('#uploadFileInputValue').val();

                    var f = document.getElementById('uploadFileInputValue').files[0];
                    var r = new FileReader();
                    var fileContent;
                    r.onloadend = function(e){
                        fileContent = e.target.result;
                    };
                    r.readAsBinaryString(f);
                    alert("hi !!")
                    if(value) {
                        $('#uploadFileModal').modal('hide');

                        var rsc = {};
                        rsc["id"] = scope.resource.def.id;
                        value = lwResources.getTypedValue(fileContent, scope.resource.def.type);
                        rsc["value"] = value;

                        $http({method: 'PUT', url: "api/clients/" + $routeParams.clientId + scope.resource.path, data: rsc, timeout:300000, headers:{'Content-Type': 'multipart/form-data'}})
                            .success(function(data, status, headers, config) { .... }
                            .error(function(data, status, headers, config) {....});;

但似乎没有解决错误。知道如何解决这个错误吗?

0 个答案:

没有答案