Java应用程序中的大图像/文件上载

时间:2016-05-19 04:10:48

标签: java apache web file-upload inputstream

我正在尝试上传图片。如果图像很小,则可以轻松上传。但是,如果我尝试上传高品质的大型壁纸,则需要永远。它显示上传89%并保持这样。我正在使用Apache commons api上传文件,并使用Inputstream来阅读。这是我的代码示例:

    ServletFileUpload upload = new ServletFileUpload();
    response.setContentType("image/jpeg");
    FileItemIterator iterator = upload.getItemIterator(request);
    while (iterator.hasNext()) {
        FileItemStream item = iterator.next();
        InputStream stream = item.openStream();
        if (item.isFormField()) {
            LOGGER.debug("Got a form field: " + item.getFieldName());
        } else {
            LOGGER.debug("Got an uploaded file: " + item.getFieldName() + ", name = " + item.getName());
            byte[] buf = new byte[stream.available()];
            ServletOutputStream outputstream = response.getOutputStream();
            while ((stream.read(buf)) != -1) {
                outputstream.write(buf, 0, buf.length);
            }
            outputstream.close();
            stream.close();
        }
    }

有什么办法可以使用上面的代码更快地上传图片吗?是否有任何api照顾它?我感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:0)

您能明确大文件的大小和JVM的最大堆大小吗? (-Xmx java选项)

可能只是你的JVM不能获得足够的内存来正确管理你的图像。 因此,一个基本的解决方案可能是将堆大小的值增加到更大的文件大小。

答案 1 :(得分:0)

我认为你得到的是一个OOM,因为else块中的代码用stream.available分配一个字节数组来指定大小。如果您为InputStreams可用方法读取javadocs,则可用方法也可能返回流中的总字节数,因此不应将其用于分配缓冲区。可能你应该使用一个小的固定大小的缓冲区。