【问题标题】:Large Image/File Upload in Java applicationJava应用程序中的大图像/文件上传
【发布时间】:2016-09-15 18:42:16
【问题描述】:

我正在尝试上传图片。如果图像很小,则可以轻松上传。但是,如果我尝试上传高质量的大壁纸,则需要很长时间。它显示上传 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?我很感激任何帮助。谢谢。

【问题讨论】:

    标签: java apache web file-upload inputstream


    【解决方案1】:

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

    这可能只是因为您的 JVM 不允许获得足够的内存来正确管理您的图像。 因此,一种基本的解决方案可能是将堆大小的值提高到与文件大小一样大的值。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2014-04-17
        • 1970-01-01
        • 2010-10-14
        • 1970-01-01
        • 2020-12-19
        • 1970-01-01
        • 2020-04-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多