【问题标题】:Writing multiple images to ServletOuputStream?将多个图像写入 ServletOutputStream?
【发布时间】:2015-06-30 06:55:10
【问题描述】:

我需要从 Web 服务(例如:List)获取多个图像,并且必须将这些图像写入 ServletOutputStream。

当我单击“VIEW”链接时,它会调用 servlet,而该 servlet 会调用 web 服务并以列表的形式接收多个图像。

现在我正在尝试将这些图像写入不工作的 ServletOutputStream..

尝试以 zip 格式发送图像

response.setContentType("application/zip");
  OutputStream os = null;
BufferedOutputStream bos = null;
ZipOutputStream zos = null;     
try{
    os = resp.getOutputStream();
    bos = new BufferedOutputStream(os);

    zos = new ZipOutputStream(bos);
    zos.setLevel(ZipOutputStream.STORED);

    sendMultipleFiles(zos, annotContent,"display");
}catch (IOException e) {
    resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
} finally {
    if (zos != null) {
        zos.finish();
        zos.flush();
    }
    bos.close();
    os.close();
}

private void sendMultipleFiles(ZipOutputStream zos, Collection<byte[]> filesToSend, String name) throws IOException {
    myLogger.info("sendMultipleFiles is invoked..");
    for(byte[] f: filesToSend) {

        InputStream inStream = null;
        ZipEntry ze = null;

        try {
            inStream = new ByteArrayInputStream(f);

            ze = new ZipEntry(name + "-archived");
            ze.setComment("Dummy file");

            zos.putNextEntry(ze);
            int readByte = 0;
            while((readByte = inStream.read()) != -1)
            {
                zos.write(readByte);
            }
        } catch (IOException e) {
            System.out.println("Cannot find " );
        } finally {
            if (ze != null) {
                zos.closeEntry();
            }
            inStream.close();

        }
    }

以上代码不起作用..任何建议将不胜感激..

【问题讨论】:

  • 您应该创建一个 zip 文件并在其中一张一张地添加每个图像。然后,将 zip 文件的内容写入 OutputStream。
  • 这种情况下的客户是什么?通常你会提供 HTML,它会引用多个图像,每个图像都会导致一个单独的请求。请给我们更多的背景信息。
  • @Jon Skeet:使用 JSF..当我点击“VIEW”链接时,它必须调用 servlet 并且响应(图像)应该显示为弹出窗口。
  • 那么它是在浏览器中显示的 HTML 吗?在这种情况下,我建议您开始考虑浏览器会看到什么 - 这是对 HTML 的 一个 响应,然后将触发每个图像的请求...
  • No HTML..当我点击链接时,它会调用 servlet,响应会自动显示在新的弹出窗口中。

标签: java servlets java-io


【解决方案1】:

您的解决方案将取决于您提供的内容类型 - 如果您提供 HTML 响应,则可以通过将图像存储在磁盘上(outside the context root 并编写图像显示端点)或如果图像很小 - 以base64 encoding in the image tag directly 发送字节。

如果您的响应类型不是 HTML - 这里有一些选项 - 您可以返回 ZIP file

通过MultiPart MIME Extension 使用servlet 的不太标准的方式。

编辑: 根据评论,mime 类型是 JPEG - 一种选择是将 JPEG 组合成一个更大的一个(不能发送多个)。组合二进制文件的字节 - JPEG 有自己的压缩格式以及页眉、页脚和 EXIF 信息 - 您可能需要专门的 API 将它们组合成一个。 Here 是我遇到的一个。如果组合 JPG 不是一种选择 - 您想要实现的目标无法一次性完成。

【讨论】:

  • 我的 Mime 类型是:image/jpeg - 不使用 html 尝试合并 PDFS 并写入输出流..修改了代码..请参考上面
  • 我没有看到您在评论中提到的内容,但是我已经编辑了答案 - 希望对您有所帮助。
  • 不工作是什么意思?有堆栈跟踪或错误要分享?
  • 通过使用API​​合并图像并写入OutputStream来解决它。
猜你喜欢
  • 1970-01-01
  • 2015-06-29
  • 2019-01-24
  • 2013-03-15
  • 2011-06-06
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多